- 论坛徽章:
- 0
|
大家好!
我正在做一个嵌入式设备通过rs485硬件接口控制modbus设备的设计,现在遇到一些问题,现在我详细的描述一下:
1、我的原始设备(就是嵌入式设备)是一个数据集中器,上的是VxWork系统,由于接口不是很够,现在计划通过外接一个ADAM 4055这么一个扩展模块,搭建一个modbus的网络环境,其连接原理图如附件所示。
2、现在主要的问题是通过C、C++编程,是嵌入式设备能够与ADAM4055建立起控制关系,ADAM4055也有自己内部的命令,我也仔细的查看了modbus rtu的命令格式描述及常见的功能码等:
格式
从机地址 功能码 寄存器地址 设置值 CRC 校验
功能码(HEX) 名称 作用
01 读线圈状态 读离散输出位
02 读输入状态 读离散输入位
03 读保持寄存器
04 读输入寄存器 读16位寄存器,常用于读取整数或者浮点数
05 写单个线圈 写数据使线圈On/OFF
06 写单个寄存器 16位格式写数据
08 回路诊断 检测通讯端口
15 写多个线圈 写数据使多个线圈ON/OFF
16 写多个寄存器 16位格式写数据
但是我始终没有找到ADAM命令与这个协议通信格式的联系方式,我的编程实现如下:
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。请各位高手指导一下,我该怎么实现与这个扩展设备的通信,以及怎么将这个扩展设备的命令正确的送达!若能指导,我将不胜感激。谢谢 |
-
|