亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? f280x_modbusprotocol.c

?? MODBUS完整原代碼,很好的東西
?? C
?? 第 1 頁 / 共 2 頁
字號:
					offset++;
				}
				*/

				if (offset>=DigitalComm[j].data_num)
				{
					if ((offset+DigitalComm[j].start_addr)>=DigitalComm[j+1].start_addr && j<DIGITAL_NO-1)
					{
						offset = 0;j++;
						value = *(DigitalComm[j].p_addr+offset);
					}
					else value=0;//狀態量清0
				}
				else
				{ 
					value = *(DigitalComm[j].p_addr+(offset>>4));
					if ( ((offset>>4)<<1) != offset>>3 ) { value >>=8;}//(offset/16*2 !=offset/8) is high--8bit of 16bit
				}
				offset +=8;
	            SerModbus.send_msg[i+3]=value&0xff;
	        }	        	        	        
	        SerModbus.crc_len=SerModbus.send_msg[2]+3;
			SerModbus.send_count=SerModbus.crc_len+2;
			break;   
	case 3://Read Holding Registers
            ///offset=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];
            ///d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];
            s_addr=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];//起始地址
            d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];//數據個數
			j=0; while((s_addr<AnalogComm[j].start_addr || s_addr>=AnalogComm[j+1].start_addr ) && j<ANALOG_NO-1){j++;}//檢索起始地址--地址范圍:Start_pre<=x && x<Start_next
			offset = s_addr-AnalogComm[j].start_addr;
						
			if (j>=ANALOG_NO-1)
			{
				j=ANALOG_NO-1;				
				if (s_addr>=CommSoeEventAddr && s_addr < CommSoeEventAddr+CommSoeEventNum)
				{//召喚SOE---!!!ThinkRoad special function
					id=(s_addr-CommSoeEventAddr)/(MACROFAULT_BYTE>>1); offset = 0;
					GetSoe(id); //soe_id:0~127
					bitclr(&soe_status[0],id);//召SOE成功則清SOE狀態標志//080414
				}
				else
				{
					ErrorResponse(3);//非法數據值
					return;    
				}
			}			
			//召喚數據地址檢測
            if (d_num<1 || d_num+5>MACROCOMM_S_NO)
            {
				ErrorResponse(3);//非法數據值
				return;    
 	        }

			//響應數據幀
			//數據類型為WORD--16bit
	        SerModbus.send_msg[2]=2*d_num;
	        for(i=0;i<d_num;i++)
	        {
				//響應數據區域索引
				if (offset>=AnalogComm[j].data_num)
				{					
					if ((offset+AnalogComm[j].start_addr)>=AnalogComm[j+1].start_addr && j<ANALOG_NO-1)
					{
						offset = 0;j++;
						value=*(AnalogComm[j].p_addr+offset);
					}
					else value=0;
				}
				else value=*(AnalogComm[j].p_addr+offset);
				/*********定值控制字邏輯變量**********/
				if ((AnalogComm[j].p_addr+offset)>=(Uint16 *)&dzkg1 && (AnalogComm[j].p_addr+offset)<((Uint16 *)&dzkg1+(MACROSETDZKG_NO<<4)) && AnalogComm[j].start_addr>=CommSetDz1Addr)//!!!控制字寄存器變量設置區域
				{
					k=AnalogComm[j].p_addr+offset-(Uint16 *)&dzkg1;
					if (bittst((Uint16 *)&dzkg1,k))
						value = 1;
					else
						value = 0;
				}
				/************************************/
				offset++;
				SerModbus.send_msg[2*i+3]=(value>>8)&0xff;//數據高位字節
				SerModbus.send_msg[2*i+4]=value&0xff;//數據低位字節
	        }
	        SerModbus.crc_len=SerModbus.send_msg[2]+3;	
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	case 4://Read Input Registers--遙測量
			SerModbus.send_count=SerModbus.crc_len+2;
			break;   
	case 5://Force Single Coil
            ctrl_point=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];//--主機修改定值點號
	        value=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];
            if(ctrl_point>CONTROL_NO-1)
            {
				ErrorResponse(3);//非法數據值
				return;    
 	        }
			if(ctrl_point<8 && dzyk_s == 1)
			{//遙控出口
				if(value)//value == 0xFF00
				{
					SerModbus.ck_point=ctrl_point;
					bitset(&kc_value,ctrl_point);
					bitset((Uint16 * )&SerModbus.ck_flag,ctrl_point);
				}
				else
				{
					SerModbus.ck_point=ctrl_point;
					bitclr(&kc_value,ctrl_point);
					bitclr((Uint16 * )&SerModbus.ck_flag,ctrl_point);
				}
				bitset((Uint16 * )&SerModbus.event_report,0);
			}
			else CommSelCtrl(ctrl_point);

		    SerModbus.send_msg[2]=SerModbus.receive_msg[2];//定值通道號高位字節
		    SerModbus.send_msg[3]=SerModbus.receive_msg[3];//定值通道號低位字節
		    SerModbus.send_msg[4]=SerModbus.receive_msg[4];//數據高位字節
		    SerModbus.send_msg[5]=SerModbus.receive_msg[5];//數據低位字節
	        SerModbus.crc_len=6;
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	case 6://Preset Single Resister--遙控量
		    SerModbus.send_count=SerModbus.crc_len+2;		
		    break;   
	case 7://Read Exception Status
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	case 8://Reserve 回送診斷校驗,把診斷校驗報文送從機,以對通信處理進行評鑒
			SerModbus.send_count=0;
			break;   
	case 9://編程(只用于484)使主機模擬編程器作用,修改PC從機邏輯
			SerModbus.send_count=0;
			break;   
	case 10://控詢(只用于484)
			SerModbus.send_count=0;
			break;   
	case 11://Fech Comm Event Ctr
			SerModbus.send_count=SerModbus.crc_len+2;
			break;   
	case 12://Fech Comm Event Log
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	case 13://編程(只用于484)使主機模擬編程器作用,修改PC從機邏輯
			SerModbus.send_count=0;
			break;   
	case 14://控詢(只用于484)
			SerModbus.send_count=0;
			break;   
	case 15://Force Mutiple Coils
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	case 16://Preset Multiple Regs--遙調量
            ///offset=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];
            ///d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];
            s_addr=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];//起始地址
            d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];//數據個數
			byte=SerModbus.receive_msg[6];//字節長度
			j=0; while((s_addr<AnalogComm[j].start_addr || s_addr>=AnalogComm[j+1].start_addr) && j < ANALOG_NO-1 ){j++;}//檢索起始地址--地址范圍:Start_pre<=x && x<Start_next
			offset = s_addr-AnalogComm[j].start_addr;

			if (d_num<1 || d_num+5>MACROCOMM_S_NO /*|| d_num!=byte/2*/)
            {
				ErrorResponse(3);//非法數據值
		        return;    
	        }
	        	        
            for(i=0;i<d_num;i++)
            {
	        	value=(SerModbus.receive_msg[i*2+7])*256+SerModbus.receive_msg[i*2+8];
				//響應數據區域索引
				if (offset>=AnalogComm[j].data_num)
				{					
					if ((offset+AnalogComm[j].start_addr)>=AnalogComm[j+1].start_addr && j<ANALOG_NO-1)
						{offset = 0;j++; }
					else
						break;		
				}
	       		*(AnalogComm[j].p_addr+offset)=value;

				//定值類型檢測
				if ((AnalogComm[j].p_addr+offset)>=(Uint16*)&clockrade && (AnalogComm[j].p_addr+offset)<((Uint16*)&clockrade+0x06))
				{//時鐘區域
					p_addr = (Uint16 *)&clockwrite;
					*(p_addr+ (AnalogComm[j].p_addr+offset-(Uint16*)&clockrade)) = value;
					flag = 0x01;
				}
				else if ((AnalogComm[j].p_addr+offset)>=(Uint16*)&nvdd_accu && (AnalogComm[j].p_addr+offset)<((Uint16*)&nvdd_accu+0x0e))
				{//電度區域
					flag = 0x02;
				}
				else if ((AnalogComm[j].p_addr+offset)>=(Uint16* )&DzDat0.Point[0] && (AnalogComm[j].p_addr+offset)<((Uint16* )&DzDat0.Point[0]+0x40) && AnalogComm[j].start_addr<CommSetDz1Addr)
				{//用戶區域
					flag = 0x03;
				}				
				else if ((AnalogComm[j].p_addr+offset)>=(Uint16*)&dzkg1 && (AnalogComm[j].p_addr+offset)<((Uint16*)&dzkg1+(MACROSETDZKG_NO<<4)) && AnalogComm[j].start_addr>=CommSetDz1Addr)//!!!控制字寄存器變量設置區域
				{//控制字邏輯變量區域
					flag = 0x04;
					k=AnalogComm[j].p_addr+offset-(Uint16*)&dzkg1;
					if(value)
						bitset((Uint16 *)&dzkg1,k);
					else
						bitclr((Uint16 *)&dzkg1,k);
				}
				else if ((AnalogComm[j].p_addr+offset)>=(Uint16* )DDRAM_DAT_ABS && (AnalogComm[j].p_addr+offset)<((Uint16* )DDRAM_DAT_ABS+0x40))
				{//其它參數區域
					flag = 0x05;
				}
				else if ((AnalogComm[j].p_addr+offset)>=(Uint16* )&DzDat1.Point[0] && (AnalogComm[j].p_addr+offset)<((Uint16* )&DzDat1.Point[0]+0x40))
				{//調試區域
					flag = 0x06;
				}
				else {ErrorResponse(3);return;}//非法數據值
				offset++;

            }

			//定值類型檢測
			if (flag==0x01)
				ClockSet();//時鐘設置
			else if(flag==0x02)
				read_energy();//電度設置(將nvdd值寫入DDRAM)
			else if(flag==0x03 || flag==0x04)
				bitset(&save_event_flag,0);//用戶定值
			else if(flag==0x06)
				bitset(&save_event_flag,1);//調試定值
			else if(flag==0x05)
				;//其它參數(自動保存)

		    SerModbus.send_msg[2]=SerModbus.receive_msg[2];//定值通道號高位字節
		    SerModbus.send_msg[3]=SerModbus.receive_msg[3];//定值通道號低位字節
		    SerModbus.send_msg[4]=SerModbus.receive_msg[4];//數據高位字節
		    SerModbus.send_msg[5]=SerModbus.receive_msg[5];//數據低位字節
            SerModbus.crc_len=6;
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	case 17://Report Slave
			SerModbus.send_count=0;
			break;   
	case 18://(884和MICRO84)
			SerModbus.send_count=0;
			break;   
	case 19://重置通信鏈路
			SerModbus.send_count=0;
			break;   
	case 20://Read Gerenal Reference
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	case 21://Write General Reference
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	case 22://Mask Write 4X Register
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	case 23://Read/Write 4X Registers
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	case 24://Read FIFO Queue
			SerModbus.send_count=SerModbus.crc_len+2;		
			break;   
	default:
			SerModbus.send_count=0;
			break;   
    }
    
    //廣播命令或者發送字節為0立即返回
    if(broad_flag==0xff || SerModbus.send_count==0)
    {
       SerModbus.Busy=0;
       SerModbus.Access=0;
       SerModbus.send_count=0;
       Ser.port_right=0;     
       return;     
    }         
    // 發送數據校驗                      
	crc_result=CRC16((Uchar *)&SerModbus.send_msg[0],SerModbus.crc_len);
	SerModbus.send_msg[SerModbus.crc_len]=(crc_result>>8)&0xff;	
	SerModbus.send_msg[SerModbus.crc_len+1]=crc_result&0xff;
	SerModbus.s_timer=0;//發送記時清零	          
	SerModbus.send_flag=0xff;//置發送標志
	//com_type=COM_SER;            
	//ComSendCtrl(com_type);//通訊口發送控制
	ComSendCtrl(Com.port_typ);
}
/*
void GetSoe(Uint16 no)
{		
	Uint16 * p_data;
	Uint16 start,size;
	p_data=(Uint16*)&fault_soe;
	size=FAULT_BYTE_NO/MACROFAULT_PAGE;
	start=FAULTAREA_ADDR+size*no;
	ReadFm24cl((Uint16*)p_data,start,size,1,FM2416_ID);//共保存7120字節故障記錄    64條故障記錄
}
*/
void GetSoe(Uint16 no)
{		
	Uint16 *p_data,*p_fault;
	Uint16 start,size;
	Uint16 id,i;
	p_data=(Uint16*)&fault_soe;
	if ((no+1) != soe_id)
	{//主機主動召喚SOE
		start=FAULTAREA_ADDR+MACROFAULT_BYTE*no;
		ReadFm24cl((Uint16*)p_data,start,MACROFAULT_BYTE,1,FM2416_ID);//共保存7120字節故障記錄    64條故障記錄
	}
	else
	{//從機請求召喚SOE
		///id = soe_id-1-fault_block_wr*MACROFAULT_PAGE;
		id = no-no/MACROFAULT_PAGE*MACROFAULT_PAGE;
		p_fault = (Uint16* )&fault_record[id];
		for(i=0;i<(MACROFAULT_BYTE>>1);i++) {*(p_data++) = *(p_fault++);}
		if (soe_count>0) 
		{
			soe_count--;
			if(++soe_id>MACROFAULT_SOE) { soe_id=1; }
			bitset(&soe_status[0],soe_id-1);//置SOE狀態標志
		}
		if (soe_count==0) {soe_id=0;}//SOE傳輸完成
	}
}

//===========================================================================
// No more.
//===========================================================================

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品99久久久久久有的能看| 国产一区二区三区久久久| 国产成人av电影在线| 欧美xxxx老人做受| 极品美女销魂一区二区三区| 精品三级av在线| 国产91丝袜在线播放0| 国产精品理论片在线观看| 99久久综合狠狠综合久久| 亚洲精品五月天| 91精品视频网| 国产精品一区在线观看你懂的| 久久久99免费| 欧美吻胸吃奶大尺度电影| 日韩av电影免费观看高清完整版在线观看| 在线成人小视频| 国产mv日韩mv欧美| 亚洲国产wwwccc36天堂| 久久久久久久电影| 欧美视频日韩视频| 国产精品99久| 亚洲国产成人av| 久久奇米777| 在线观看一区日韩| 国产麻豆精品在线观看| 亚洲精品你懂的| 久久精品一级爱片| 欧美日韩精品一区二区| 成人性视频免费网站| 欧美a一区二区| 一区二区三区四区视频精品免费 | 91精品婷婷国产综合久久性色| 精一区二区三区| 夜夜嗨av一区二区三区| 久久久www成人免费毛片麻豆| 欧美日韩国产美| 91日韩一区二区三区| 精品夜夜嗨av一区二区三区| 亚洲一区免费视频| 国产精品久久久久久久蜜臀| 日韩一区二区在线观看| 欧美色网站导航| www.日韩大片| 国产曰批免费观看久久久| 天堂在线一区二区| 亚洲黄色免费电影| 亚洲天堂2016| 亚洲欧洲在线观看av| 欧美精品一区二区三区蜜臀| 欧美日韩精品三区| 欧美体内she精视频| av午夜精品一区二区三区| 成人午夜大片免费观看| 国产经典欧美精品| 国内精品伊人久久久久影院对白| 亚洲成a人片综合在线| 亚洲综合精品自拍| 一区二区三区欧美| 一区二区三区影院| 亚洲国产成人av好男人在线观看| 一区二区三区91| 亚洲国产精品久久久久婷婷884| 一区二区三区色| 伊人一区二区三区| 一区二区三区美女| 一区二区三区四区在线| 亚洲男同性恋视频| 亚洲最新在线观看| 亚洲国产成人精品视频| 爽好多水快深点欧美视频| 日韩精品91亚洲二区在线观看| 亚洲v精品v日韩v欧美v专区| 五月天激情综合| 美女视频第一区二区三区免费观看网站| 午夜不卡av在线| 蜜臀久久99精品久久久久宅男| 秋霞午夜鲁丝一区二区老狼| 久久国产精品99久久久久久老狼 | 一区二区三区av电影 | 免费看欧美美女黄的网站| 日韩二区三区在线观看| 免费成人在线播放| 国产麻豆91精品| 99天天综合性| 欧美丝袜丝交足nylons| 日韩一二三区视频| 国产日韩v精品一区二区| 日韩毛片在线免费观看| 日本成人中文字幕| 成人免费的视频| 欧美丝袜自拍制服另类| 精品久久久久av影院| 亚洲视频在线观看三级| 日韩成人一区二区三区在线观看| 韩国中文字幕2020精品| 色婷婷狠狠综合| 亚洲国产精品影院| 亚洲欧洲无码一区二区三区| 国产精品久线观看视频| 亚洲一区在线视频| 国产精选一区二区三区| 欧美性高清videossexo| 日韩美女一区二区三区四区| 国产精品每日更新| 日本不卡在线视频| 成人av网址在线| 欧美日韩国产一级片| 久久亚洲精品小早川怜子| 亚洲精品国产高清久久伦理二区| 日本网站在线观看一区二区三区| 国产91丝袜在线观看| 制服.丝袜.亚洲.另类.中文| 中文字幕亚洲视频| 国产精品中文欧美| 日韩情涩欧美日韩视频| 亚洲综合丁香婷婷六月香| 粉嫩aⅴ一区二区三区四区五区| 欧美女孩性生活视频| 国产精品丝袜91| 国产在线不卡视频| 欧美一卡二卡三卡四卡| 亚洲自拍与偷拍| 成人激情图片网| 精品国产乱码久久久久久久 | 色偷偷成人一区二区三区91 | 粉嫩欧美一区二区三区高清影视| 欧美写真视频网站| 国产精品久久久久久久久免费樱桃 | 久久综合色8888| 婷婷亚洲久悠悠色悠在线播放| 色综合久久中文综合久久97| 欧美激情一区二区三区在线| 乱一区二区av| 欧美成人三级在线| 久久精品国产精品亚洲红杏| 欧美另类高清zo欧美| 亚洲精品免费电影| 91猫先生在线| 亚洲品质自拍视频| 色欧美片视频在线观看在线视频| 国产精品乱码一区二区三区软件| 国产黄色精品网站| 国产日韩三级在线| 丁香婷婷深情五月亚洲| 久久精品日产第一区二区三区高清版 | 欧美日韩国产系列| 亚洲成va人在线观看| 91精品久久久久久久久99蜜臂| 日韩不卡一区二区三区| 精品裸体舞一区二区三区| 狠狠色丁香婷综合久久| 国产日产精品1区| 99精品国产一区二区三区不卡| 成人欧美一区二区三区黑人麻豆 | 亚洲成av人在线观看| 在线精品视频免费播放| 日韩高清一区在线| 精品国产制服丝袜高跟| 国产不卡视频在线观看| 一区二区三区中文免费| 欧美剧情片在线观看| 国产一区二区三区四| 国产精品成人免费在线| 欧美日韩在线播放| 精品一区二区三区久久久| 国产精品污网站| 欧美中文字幕亚洲一区二区va在线| 亚洲成av人片一区二区| 日韩美一区二区三区| 99久久99久久免费精品蜜臀| 亚洲风情在线资源站| www国产成人免费观看视频 深夜成人网| 国产高清在线精品| 亚洲线精品一区二区三区八戒| 日韩欧美电影一二三| 91在线观看视频| 国产一区二区在线免费观看| 亚洲免费资源在线播放| 精品乱人伦小说| 欧美午夜精品久久久久久孕妇| 国产一区二区在线观看视频| 亚洲自拍偷拍图区| 国产精品视频一二三区| 日韩一区二区在线免费观看| 99国产一区二区三精品乱码| 蓝色福利精品导航| 亚洲制服丝袜在线| 国产精品久99| 2019国产精品| 日韩亚洲欧美高清| 日本电影亚洲天堂一区| 国产精品1区2区| 麻豆一区二区三| 日韩不卡手机在线v区| 亚洲精品免费在线观看| 中文成人综合网| 久久久99久久| 久久五月婷婷丁香社区| 在线播放/欧美激情| 欧美丝袜丝交足nylons|