我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)

我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)

分类: 〖自动化〗2007-07-19 10:04 34038人阅读 评论(38) 收藏 举报

vb嵌入式dostcp语言医疗

其实很早就想写写关于Modbus的开发历程,但牵扯项目较多,不同语言版本较多,头绪繁杂,一时不知从何写起。最近的医疗项目的通信部分,重新调整为Modbus协议,并且内容几乎涵盖了Modbus的方方面面(Rtu/Tcp,Slave/Client相关开发),所以更坚定了写Modbus信心,今天忙里偷闲,以时间为序,以项目为纲,把Modbus相关开发经历一一道来。

一、焦炉四大车通信系统(2002~2005

硬件平台:西门子PLC200

操作系统:Win2000/XP

1、  主PLC与PC机的通信

最早主PLC与PC机通信,采用自定义的协议,主PLC中做了一个类似木马的程序来响应PC机下发的读写V变量区的指令。这样就完成了PLC的读写操作。

后来西门子PLC的开发软件进行了升级,提供了Modbus Rtu Slave库,这样只要上位机实现Modbus Rtu Client就可以直接读写PLC变量区了,之后用VB开发了Modbus相应的组件,这样很长一段内,该系统PC与主PLC就采用了Modbus的通信。

前两年开发组态软件,所以西门子PPI协议顺礼成章也就知道了,当然PC与西门子采用PPI协议是最棒的,因为PLC中不需要写一行代码,也无需占用程序和变量空间。所以之后Modbus被放弃了,转而采用了PPI通信协议。

2、  主PLC与从PLC的通信(无线电台通信)

刚开始主PLC与从PLC采用自定义协议,最早在首钢做实验的时候,只有四个从站,并且个数是唯一确定的,所以自定义协议用的很好,效率也很高;但是项目推广后,在其它现场有7个从站的,也有8个,9个的,不确定,并且从站要分组,此外通信传递内容也更多了,不光位置信息、推焦电流、推焦、平煤信号、连锁信号都要传递,最后选择了Modbus协议。

但是使用Modbus有几个问题,第一西门子提供的Modbus Slave不支持广播命令,第二只提供了Modbus Slave程序,从PLC没有什么问题,但是主PLC却没有Modbus Client程序。

对第一个问题,没有办法,不支持就算了,只要一个个来写。(注:后来的某一天,西门子MicroWIN开发环境突然出bug了,竟然看到了部分的西门子Modbus Slave源码,我在此基础上实现了可支持广播的Modbus Slave代码)。

对第二个问题,只好老老实实的用西门子 PLC 语句表命令开发Modbus Client,只要实现3号和16号命令就可以了,还好,Modbus Client本身协议不难,难在PLC的运行机制和PC程序不同,PLC是大循环扫描的,等待数据返回时,不能直接等待,否则运行看门狗会超时,总之克服重重困难,终于开发出稳定可靠的Modbus Client程序,直到现在,现场的PLC通信仍采用该方式。

附记:有人会问,为什么没有采用PPI协议,PLC本身就支持主和从协议啊?但太让人遗憾的是,PPI协议通信节奏太快,目前还没有无线电台(普通工业用)可以正常实现PPI协议通信。

该焦炉四大机车相关介绍,可以参见我以前写的文章:

http://www.gongkong.com/tech/example/detail_1.asp?id=4055

相关专利

http://www.cpsfu.com/C10B/2003/1456635.shtml

我开发的Modbus控件介绍

http://blog.csdn.net/yefanqiu/archive/2005/11/20/533315.aspx

我开发的PPI控件介绍

http://blog.csdn.net/yefanqiu/archive/2005/11/18/532256.aspx

二、AB PLC扩展模块ProSoft MVI56通信模块(2005年11月)

在做济钢四车项目的时候,由于PLC采用的是AB RsLogix5000系列的PLC,上面的端口不支持自由口编程,无法读取我们定位标尺的数据,所以购买了与其合作的ProSoft公司专门生产第三方模块。ProSoft生产的模块有很多种,由于没有经验,很不幸,我们选择的是MVI56的模块,而这个模块却是全部自由编程,不含有任何默认协议。

该模块典型的就是一个嵌入式系统,相当一个带三个串口的386的电脑,操作系统为小型的DOS系统(TINY DOS),用C++为其开发程序。

在开发完我们的红外定位标尺的读取程序后,顺便也开发一个Modbus Rtu Client的程序,这样AB的PLC可以直接和Modbus 的设备进行通信了。

相关文章,请参见我以前写的文章:

http://blog.csdn.net/yefanqiu/archive/2005/11/20/533440.aspx

三、隧道广告影像系统(2004~2006

隧道广告影像系统的通信系统,采用12个通信子站(NetBoxII),刚开始并没有任何Modbus协议,直到有一天,客户提出要控制节目播放的次序、次数和播放时间,最后决定在地铁隧道里,添加一个西门子PLC200系统,由于设备早已安装完成,不可能为PLC布一个五六百米的通信线路,只好利用原通信线路,而最上层的通信为TCP,NetBoxII下一层才是485总线,所以NetBoxII当仁不让的成了通信桥的设备。

但是,问题来了,上位机PC如何通过TCP与基于485的PLC进行通信?

最后,决定西门子PLC中安装Modbus Rtu Slave程序,实现一个标准Modbus设备,NetBoxII实现 Modbus Tcp到Modbus Rtu的协议转换。也就是说,在NetBoxII中实现Modbus Tcp Slave和Modbus Rtu Client代码。

这样用BC3.0,DOS平台下实现了Modbus Tcp/Rtu协议转换功能,实现了上位机PC与PLC的通信的要求。

隧道广告的相关介绍,可以参见我以前写的文章:

http://blog.csdn.net/yefanqiu/archive/2006/08/16/1074382.aspx

四、嵌入式组态系统(2006年1月~至今)

开发组态系统,自然而然的要实现各种通信协议的驱动,所以Modbus 协议的开发不在话下。

分别用EVC和VC实现了Modbus Rtu/AscII/Tcp的Client通信协议驱动。

嵌入式组态系统的相关介绍,可以参见我以前写的文章:

http://blog.csdn.net/yefanqiu/archive/2006/11/29/1419479.aspx

http://blog.csdn.net/yefanqiu/archive/2006/11/19/1396827.aspx

http://blog.csdn.net/yefanqiu/archive/2006/10/24/1348840.aspx

五、LED影像系统(2006年12月~至今)

 

  

目前关于通信这块代码还没有做,不过已决定用C#开发Modbus Rtu Client程序和单片机开发的硬件设备进行通信(单片机中实现Modbus Rtu Slave,这部分有专门的硬件工程师实现),通过Modbus的通信实现LED大屏各种参数的配置。

LED系统相关介绍

http://blog.csdn.net/yefanqiu/archive/2007/05/28/1627782.aspx

六、医疗系统(2007年6月~至今)

目前这部分正在做,除红外通信板的Modbus Rtu Slave用汇编实现外,其它的都用C#语言实现。

七、Modbus Rtu 通信协议(3,16号命令)

 

1、 读取保持寄存器(单个和多个,以字为最小单位)

发送命令帧:


设备地址


功能码


地址H


地址L


数据量H


数据量L


CRC H


CRC L


Addr0


3 H


HoldStart


DataNum


CRC高位


CRC低位

帧 长 度:8个字节

设备地址:1~247

功 能 码:3H

数据地址:0~65535   具体范围与相关设备有关

数    量:1~65535   具体范围与相关设备有关

校 验 码:CRC16校验

返回命令帧:


设备地址


功能码


数据量


数据1


数据N


CRC H


CRC L


Addr1


3 H


返回数据的字节数N


Data (1~N)


CRC高位


CRC低位

帧 长 度:5+N 个字节

设备地址:1~247

功 能 码:3H

数 据 量:实际的读取数据数量

数    据:返回数据的意义

a=HoldStart

n= DataNum-1


VW a (VB a)


VWa(VB a+1)



VW a+n(VB a+n)


VWa+n(VB a+n+1)


Data(1)


Data(2)



Data(N-1)


Data(N)

校 验 码:CRC16校验

命令有误:

1)        没有任何返回

2)        返回异议帧


设备地址


功能码


错误信息


CRC H


CRC L


Addr1


83 H


一个字节的错误信息


CRC高位


CRC低位

2、 设置保持寄存器(多个,以字为最小单位)

发送命令帧:


设备地址


功能码


地址H


地址L


数据量H


数据量L


数据字节数


具体

数据


CRC H


CRC L


Addr0


10 H


HoldStart


DataNum


bytN


1~bytN


CRC高位


CRC低位

帧 长 度:9+bytN 个字节

设备地址:1~247

功 能 码:10H

数据地址:0~65535   具体范围与相关设备有关

数    量:1~122     具体范围与相关设备有关

字 节 数:设置的字节个数 bytN= DataNum×2

数    据:具体的字节数据

校 验 码:CRC16校验

返回命令帧:


设备地址


功能码


地址H


地址L


数据量H


数据量L


CRC H


CRC L


Addr1


10 H


HoldStart


DataNum


CRC高位


CRC低位

帧 长 度:8 个字节

设备地址:1~247

功 能 码:10H

数据地址:0~65535   具体范围与相关设备有关

数    量:1~122     具体范围与相关设备有关

校 验 码:CRC16校验

命令有误:

1)    没有任何返回

2)      返回异议帧


地址


功能码


错误信息


CRC H


CRC L


Addr1


90 H


一个字节的错误信息


CRC高位


CRC低位

八、一点总结

编写通信相关的程序,其实协议和开发语言并不重要,重要的是对通信双方的通信设备的特点,性能要有充分了解,这样才能开发出可靠,高效的通信程序。

我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)

时间: 2024-10-14 14:14:14

我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)的相关文章

Modbus测试工具ModbusPoll与Modbus Slave使用方法

一.介绍 Modbus Poll :Modbus主机仿真器,用于测试和调试Modbus从设备.该软件支持ModbusRTU.ASCII.TCP/IP.用来帮助开发人员测试Modbus从设备,或者其它Modbus协议的测试和仿真.它支持多文档接口,即,可以同时监视多个从设备/数据域.每个窗口简单地设定从设备ID,功能,地址,大小和轮询间隔.你可以从任意一个窗口读写寄存器和线圈.如果你想改变一个单独的寄存器,简单地双击这个值即可.或者你可以改变多个寄存器/线圈值.提供数据的多种格式方式,比如浮点.双

私.Modbus测试_ZC03_rtu,ascii,tcp

ZC:另外一些信息在 "Modbus资料 - codeskill_android - 博客园.html"(https://www.cnblogs.com/codeskilla/p/9998416.html) 1.文章:modbus4j,rtu,ascii,tcp_ip传输模式 - 狂野的河 - CSDN博客.html(https://blog.csdn.net/u013150916/article/details/78065479?locationNum=9&fps=1#com

组态王MODBUS TCP数据报格式

在大家通读Modbus协议时,总是会碰到一些容易混淆的名词,从而导致对于协议的解读出现问题,在本文中,我 们对于Modbus协议中可能会给大家造成困惑的名词作相关的解释. 1.功能码:功能码在modbus协议用于表示信息帧的功能,常用的功能码有03,04,06,16等,其中03功能码的作 用是读保持寄存器内容,04功能码的作用是读输入寄存器内容(输入寄存器和保持寄存器的区别看下文),06功 能码的内容是预置单个保持寄存器,16功能码的内容则是预置多个保持寄存器. 2.输入寄存器和保持寄存器:04

Modbus关于ASCII模式和RTU模式两种传输方式的区别

常用的MODBUS通讯规约有两种,一种是MODBUS ASCII,一种是MODBUS RTU.每个设备必须都有相同的传输模式.所有设备都支持RTU模式,ASCII传输模式是选项.除此之外ASCII模式和RTU模式还有什么区别呢? 1.ASCII模式 当控制器设为在Modbus网络请添加链接描述上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit 字节都作为两个ASCII字符发送.这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误. 代码系统 十六进制,ASCII字符0

浅谈-对modbus的理解

浅谈-对modbus的理解 一.简介 Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准.1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP. Modbus协议是一项应用层报文传输协议,包括ASCII.RTU.TCP三种报文类型. 标准的Modbus协议物理层接口有RS232.RS422.RS485和以太网接口,采用master/slave方式通信. 二.报文 先来简单分析一条MODBUS报文,例如:01  06  00 01  00

modbus通讯协议详解

一.Modbus 协议简介  Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议.通过此协议,控制器相互之间.或控制器经由网络(如以太网)可以和其它设备之间进行通信.Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备.一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave.典型的主设备包括工控机和工业控制器等:典型的从设备如PLC可编程控制器等.Modbus通讯物理接口可以选用串口(包括RS232和RS485),

基于AVR128的简单Modbus协议实现

Modbus通讯协议是由Modicon公司在1979年开发的,应用于工业现场控制的总线协议.Modbus通讯系统包括带有可编程控制的芯片节点和公共传输线组成,其目的是用于多节点数据的采集和监控.Modbus协议采用主从模式,通讯系统中有一个主机对多个节点从机进行监控,从机节点最多支持247个.每个从机均有自己独立的从机地址,而且改地址能够被主机识别. 能够支持Modbus协议的通讯系统有RS-232,RS-422,RS-485等.同时Modbus协议具有标准.开放.免费.帧格式简单等特点而被广大

MODBUS协议相关代码(CRC验证 客户端程序)

Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议.通过此协议,控制器相互之间.或控制器经由网络(如以太网)可以和其它设备之间进行通信.Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备.一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave.典型的主设备包括工控机和工业控制器等:典型的从设备如PLC可编程控制器等.Modbus通讯物理接口可以选用串口(包括RS232和RS485),也可以选择以太网口. 1.十六

Modbus通用数据读取工具设计及使用

一.公共功能码定义 二.能读取的数据类型 1.bit类型,比如01功能码,读到的就是位的状态,是ON 还是OFF,也就是对应着0或1. 2.byte类型,比如03功能码. 3.short类型,比如03功能码. 4.int32类型.也还是比如03功能码. 三.整数型和小数型的转换等 1.Modbus协议进行通信的时候,所有的数据都是以整数表示,因此,实际的数据,和接收到的数据,还有有一定的差异的,需要乘以一定的比例系数. 2.在接收到的数据进行转换的时候,因为产家的不同,因此会有小数点后面的精度也