- 論壇徽章:
- 0
|
大家好!
我正在做一個嵌入式設備通過rs485硬件接口控制modbus設備的設計,現(xiàn)在遇到一些問題,現(xiàn)在我詳細的描述一下:
1、我的原始設備(就是嵌入式設備)是一個數(shù)據(jù)集中器,上的是VxWork系統(tǒng),由于接口不是很夠,現(xiàn)在計劃通過外接一個ADAM 4055這么一個擴展模塊,搭建一個modbus的網(wǎng)絡環(huán)境,其連接原理圖如附件所示。
2、現(xiàn)在主要的問題是通過C、C++編程,是嵌入式設備能夠與ADAM4055建立起控制關系,ADAM4055也有自己內部的命令,我也仔細的查看了modbus rtu的命令格式描述及常見的功能碼等:
格式
從機地址 功能碼 寄存器地址 設置值 CRC 校驗
功能碼(HEX) 名稱 作用
01 讀線圈狀態(tài) 讀離散輸出位
02 讀輸入狀態(tài) 讀離散輸入位
03 讀保持寄存器
04 讀輸入寄存器 讀16位寄存器,常用于讀取整數(shù)或者浮點數(shù)
05 寫單個線圈 寫數(shù)據(jù)使線圈On/OFF
06 寫單個寄存器 16位格式寫數(shù)據(jù)
08 回路診斷 檢測通訊端口
15 寫多個線圈 寫數(shù)據(jù)使多個線圈ON/OFF
16 寫多個寄存器 16位格式寫數(shù)據(jù)
但是我始終沒有找到ADAM命令與這個協(xié)議通信格式的聯(lián)系方式,我的編程實現(xiàn)如下:
printf("Routine is running InitADAMModule()...\n");
// char chCommand[]={'%','0','A','0','A','4','0','0','6','0','4',0x0d}; 這ADAM內部的命令,以回傳結束
fd_set Rs485Set;
FD_ZERO(&Rs485Set);
FD_SET(rs485Fd,&Rs485Set);
struct timeval myTimeOut;
myTimeOut.tv_sec=5; //5s
myTimeOut.tv_usec=0;
char chCommand[]={'$','0','A','F',0x0d};
int iTmp=0;
printf("Read the return of command $AAF...\n");
iTmp=rs485_write(rs485Fd,(Byte*)&chCommand,strlen(chCommand));
printf("rs485_write return bytes :%d\n",iTmp);
if((select(rs485Fd+1,&Rs485Set,NULL,NULL,&myTimeOut))!=0)
{
printf("Read the return of command $AAF...\n");
char readbuf[50]={'0'};
int iRead=rs485_read(rs485Fd,(Byte*)readbuf,50);
printf("rs485_read return bytes :%d %s\n",iRead,readbuf);
}
else
printf("outtime.\n");
return 0;
但是,打印一直是outtime。請各位高手指導一下,我該怎么實現(xiàn)與這個擴展設備的通信,以及怎么將這個擴展設備的命令正確的送達!若能指導,我將不勝感激。謝謝 |
|