免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4731 | 回复: 3

[驱动] 精通modbus协议的高手请进 [复制链接]

论坛徽章:
0
发表于 2012-02-14 17:25 |显示全部楼层
大家好!
我正在做一个嵌入式设备通过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。请各位高手指导一下,我该怎么实现与这个扩展设备的通信,以及怎么将这个扩展设备的命令正确的送达!若能指导,我将不胜感激。谢谢
ModBus连接图.JPG

论坛徽章:
0
发表于 2012-02-15 08:38 |显示全部楼层
没玩过Modbus,楼主可以先确认好 “从机地址 功能码 寄存器地址 设置值 CRC 校验”这些东西发送的正确否。

论坛徽章:
0
发表于 2012-02-27 11:25 |显示全部楼层
modbus 不是有个 c语言的 库的吗?

论坛徽章:
0
发表于 2013-05-06 16:09 |显示全部楼层
建议你先用modbus poll 和 modbus slave将你的设备调试好,然后看通讯的数据。我看你直接发送的chCommand是不符合modbus RTU协议的。其实modbus有开源的软件,项目是freemodbus,你可以下载下来,参考一下。个人不建议直接发送数据给modbus设备,最好把modbus移植到自己的系统中。


专注智能数字传感器,提供数据采集、无线传输、数据存储
上海左岸芯慧电子科技有限公司
www.zaxh.com.cn
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP