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