
modbus tcp协议和modbus协议通过tcp传输其实就是同一回事。最近有一个项目是涉及到modbustcp,其中1200作为服务器,其他的五台第三方设备作为客户端,1200程序里使用了5个MB_SERVER的指令块,每个指令块的connect参数中TCON_IP_V4中的RemoteAddress参数设置了五个不同的IP地址,每个设备对应一个IP地址,重点是这5个MB_SERVER指令块的localport我都是设置为502,经过测试通讯并没有问题。
但是这两天我翻阅西门子关于modbustcp的文档,发现如果建立多个MB_SERVER进行并发连接的话需要不同的端口号,例如需要设置为502,503,504,但是项目实际都是502的话通讯是没有问题的,我想问的是我把5个MB_SERVER的localport都设置为502,但是通讯成功是因为我把RemoteAddress绑定了客户端的IP地址吗?
如果按照西门子所说需要设置不同的端口号502503504,那么作为客户端的第三方设备是不是也需要分别设置服务器的端口号502503504呢,但是现在这些第三方设备默认的服务器端口都是502,没有更改的选项,把我弄的有点糊涂。
希望前辈可以指导一下,1200作为服务器,并且需要连接多个客户端,并且需要调用多个MB_SERVER指令块并发连接,其中MB_SERVER的localport端口号需要设置为不同吗?不胜感激自从 1979 年出现工业串行链路的事实标准以来,Modbus使成千上万的自动化设备能够通信。Modbus 是OSI模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。Modbus应用层协议和服务规范主要包含两类:一类是串行链路上的Modbus(Modbus 串行链路取决于TIA/EIA 标准:232-F 和 485-A),另一类是TCP/IP 上的Modbus(Modbus TCP/IP 取决于IETF 标准:RFC793 和 RFC791 有关)。Modbus通信栈示意图如下所示:
Modbus协议允许在各种网络体系结构内进行简单通信,每种设备(PLC、HMI、控制面板、驱动程序、动作控制、输入/输出设备)都能使用 Modbus协议来启动远程 *** 作。在基于串行链路和以太 TCP/IP 网络的 Modbus上可以进行相同通信,一些网关允许在几种使用 Modbus协议的总线或网络之间进行通信。Modbus网络体系结构的实例如下所示:
Modbus协议本质上和我们平时自定义的协议一致,就是一种数据传输格式,也是由起始帧、数据帧、校验帧等组成,只不过Modbus协议更为规范。
Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上 的 Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域,通用Modbus帧协议如下图所示:
具体解析如下:
地址域:子节点的地址信息;
功能码:指明服务器要执行的动作,有效的码字范围是十进制 1-255(128-255 为异常响应保留),当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种 *** 作(功能码内容较多,建议查阅Modbus协议说明手册,上面介绍的很清晰)。
数据:传输的数据内容,在某种请求中,数据可以是不存在的(0 长度),在此情况下服务器不需要任何附加信息,功
能码仅说明 *** 作。
差错校验:验证收、发的数据是否正确。
如果在一个正确接收的 ModbusADU 中,不出现与请求Modbus功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。如果出现与请求 Modbus功能有关的差错,那么域包括一个异常码,服务器应用能够使用这个域确定下一个执行的 *** 作。Modbus事务处理的状态图如下所示:
一旦服务器处理请求,使用合适的 Modbus服务器事务建立 Modbus响应,根据处理结果,可以建立两种类型响应:
一个正确Modbus响应:响应功能码 = 请求功能码 ;
一个 Modbus异常响应:用来为客户机提供处理过程中与被发现的差错相关的信息,提供一个异常码来指示差错原因。响应功能码 = 请求功能码 + 0x80。
将上述图示分解理解,例如,客户机与服务器执行Modbus 通信协议,当服务器对客户机响应时,它使用功能码来指示正常(无差错)响应或者出现某种差错(称为异常响应)。
对于一个正常响应来说,服务器仅对原始功能码响应,Modbus事务处理(无差错)如下图所示:
对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑 1,Modbus事务处理(异常响应)如下图所示:
Modbus使用一个Big-Endian 表示地址和数据项。这意味着当发射多个字节时,首先发送最高有效位。例如:
寄存器 数据
0x4001 0x1234
发送的第一字节为 0x12,第一字节为0x34。
Modbus以一系列具有不同特征表格上的数据模型为基础,四个基本表格如下表所示:
对于基本表格中任何一项,协议都允许单个地选择 65536 个数据项,而且设计那些项的读写 *** 作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。
数据模型这个概念有限抽象,让我们通过以下两个示例加深理解。
示例1 :有 4 个独立块的设备
示例描述:一个设备中的数据结构,含有数字量和模拟量、输入量和输出量。由于不同块中的数据不相关,每个块是相互独立。使用Modbus数据模型,按不同 Modbus功能码访问每个块,实现原理如下所示:
示例2:仅有 1 个块的设备
示例描述:一个设备仅有 1 个数据块,使用Modbus数据模型,通过几个Modbus功能码可能得到一个相同数据,或者通过 16 比特访问或 1 个访问比特,实现原理如下所示:您好,Modbus是一种通用的工业网络协议,它用于在工业设备之间进行通信。ControlNet是一种基于以太网的工业网络协议,它用于在工业设备之间进行高速数据传输。Modbus转ControlNet的过程需要一个中间件,它可以将Modbus协议转换为ControlNet协议,以便在不同类型的设备之间进行通信。中间件可以是一个软件程序,也可以是一个硬件设备,它可以接收Modbus报文并将其转换为ControlNet报文,从而实现Modbus转ControlNet的过程。兴达三菱转以太网模块 之 三菱fx系列plc如何实现Modbus TCP服务器
硬件:三菱fx 一个
兴达易控三菱转以太网 CHNet-FX 一台
CHNet-FX模块太网口它支持8个连接,那么也就是说,当我们plc做ModbusTCP服务器的时候可以有同时8个Modbus TCP客户端。同时和他进行通讯,
我们所需要的一些软件这个以太网调试助手,用来调试这个调试这个plc这个服务器,调试程序,然后我们还会用到这个Modbus poll可以来模拟,ModbusTCP服务器,ModbusRTU主站,以及Modbus ASC主站,
接下来我们继续说一下这个三菱FX5U他实现Modbus TCP这个组态过程,下面就是我们做好的一个这个工程
要实现他这个Modbus TCP他这个过程呢,首先呢第一步用FX5U PLC 与CHNet-FX连接
新建 FX3U/FX3UC 工程,双击导航栏中的连接目标:Connection。
跳出的选项板后,在计算机侧选择双击“EthernetBoard”选项,随后提醒中点击“是”;在可编程控制器侧双击“PLC Module”;
在随后的跳出的设置中,点击“搜索网络上的 FXCPU(S)”后,会搜索到 CHNet-FX所连接的 FX3UC。
按图中标号依次选择后,最后点击确认;
在上述中选择好 IP 地址后,点击“通信测试”,即可提示与 FX3UCCPU 连接
5随后即可“在线”选项栏中,进行 PLC 的读取、写入和监视等 *** 作。
Modbus分配地址
PLC配置
口号就是502端口,作为服务器需要设置的参数,
这个逻辑程序D0、D1、D2、D3分别付了初值是K0、K1、K2、K3在初始化的时候我们对D4、D5、D6、D7进行个清零 *** 作设置的这个参数,通讯手段默认ModbusTCP,可编程IP地址就是前面设置的,1921681161端
使用了一个特殊标志位,每一分钟我们会对D0、D1、D2、D3作一个加一 *** 作,看看能不能做一个加一 *** 作,然后会实时的判断,当D0、D1、D2、D3各自的值大于6000的时候分别各自清零,也就说d0d1d2d3的值他会每一分钟都会发生改变,并且d0d1d23d3的纸最终它是会在零到6000之间发生一个变化,(包括0和6000)
这么做的目的是为了客户端去读取PLC的寄存器的时候,D0、D1、D2、D3是变化的方便我们观察变化。这就是一小段逻辑程序
进入程序监视
此时D0、D1、D2、D3分别是0、1、2、3;过1分钟就会进行一下+1 *** 作下面就可以测PLC程序了
先用以太网调试助手进行测试
适配器是PLC通过CHNet-FX网线连接到路由器,电脑通过无线网卡连接到路由器
协议模式:客户端 Client
目标IP:CHNet-FX用户自定义IP地址modbus是一种比较通用的协议,用来做数据采集很方便,也很便宜,至少比NI的板卡便宜两个量级,但是配置较为复杂,同时采集速率并不高。对于1s左右采样间隔的数据来说,modbus是一种非常合适的方式。
labview使用modbus有很多种方法,其中最方便地第一种就是用共享变量引擎(Shared Variable Engine, SVE)来读写modbus的寄存器(类似模拟IO)和线圈(数字IO)。其他方法比较繁琐,因此这里只研究了这种labview使用I/O Server访问modbus的方式,其它的比如采用VISA的modbus串口/TCP VI进行读写的方式以及采用OPC服务器进行读写的方式在这里就不研究了。
这里采用的win10 64bit中文版系统,Labview 2018(和谐版),同时安装了分布式控制系统(Distributed Control System, DSC),这样就可以使用modbus I/O Server了,根据官网资料,除了labview,必须还要安装DSC或者RT模块,才能使用modbus,其中最好是安装DSC模块。
这里的系统架构如下图所示,Labview负责逻辑和前端展示,与PLC的modbus协议进行交互是通过I/O Server完成的。I/O Server其实是NI 的共享变量引擎SVE的一种插件。所以在运行的时候需要安装和启动SVE。
这个SVE一般在windows里面是以服务形式安装的,安装的服务名为NITaggerService,安装位置是在C:\Program Files (x86)\National Instruments\Shared\Tagger。如果是SVE的一些问题,可以查看这个服务是否启动。但是坑爹的NI没有说log文件在哪儿,有时候查错很麻烦。
安装了DSC之后,就可以启用modbus I/O Server了,对于中文Win10系统装labview 2018而言,坑的地方在于你按照官网教程走完是不行的,会出现modbus变量无法读取的问题,并且显示链接已经断开。如果你手动启动SVE服务(即:NITaggerService),当时是可以启动的,然后你用NI分布式系统管理器(NI distributed system manager)查看变量会不成功,再看服务已经停止了,但是由于没有log文件,所以我们也不知道它什么时候停止的。
后来发现一个方法可以修正这个问题:在NI分布式系统管理器中重新编辑一次I/O Server(参考下土),再在“ *** 作”菜单下点击“启动本地共享变量引擎”,所有的值就正常了。
modbus在I/O Server中的的地址设置比较诡异,是按照[数据解释类型][功能码地址头][PLC格式的起始地址][位]来区分的。
比如SD400002,其中数据解释类型是SD,表示有符号的双字整数(Signed DWord Integer),双字意味着这是个32位的整数,需要两个寄存器,功能码地址头是4,表示功能码是3,即modbus的保持寄存器(Holding Register)字段,后面的PLC格式的起始地址是5位的00002,也就是从第2个寄存器开始,连续取2个寄存器(即00002和00003),组合成有符号的双字整数。
至于组合的过程涉及到大小端(Endianness)的问题,大小端涉及到byte order和word order的问题,一个word就是一个寄存器(16位),一个byte是8位,当一个寄存器中的两个byte组合并解释为变量的具体取值的时候,可以选择把哪个byte放到前面,哪个byte放到后面,这就是byte order,大部分情况下,byte order是大端在前(big endianness),而word order则是在两个寄存器储存的两个16位的字(word),如何组成32位的数据,不同的厂商会有不同的约定,这个就差异比较大了,需要查看手册。
NI的modbus I/O Server中,word order可以在高级选项中设置,但是byte order是没有地方可以设置的。
此外,NI还有一个比较坑爹的地方是它的modbus tcp连接不支持502以外的端口。也就是一个IP地址最多只能对应一个modbus,虽然可以靠Unit ID来进行区分,但是实际使用中也可能存在用不同端口区分设备的情况。
1[How LabVIEW Uses I/O Servers]( >S7-1500 CPU 和 S7-1200 CPU 之间可以实现 Modbus/TCP 的通信。在 S7-1500 CPU 和 S7-1200 CPU 中调用 “MB_CLIENT” 和 “MB_SERVER” 指令并参数化。
“MB_CLIENT” 指令把 CPU 的以太网连接实现为 Modbus/TCP 客户机通信。使用 “MB_CLIENT” 指令在客户机和服务器之间建立连接,发送请求和接收响应,和控制连接断开。
The "MB_SERVER" 指令把 CPU 的以太网连接实现为 Modbus/TCP 服务器通信。使用 "MB_SERVER" 指令处理 Modbus/TCP 客户端的连接请求,接收来自 Modbus 的请求并发送响应消息。
在这个例子中,通过两个Modbus/TCP连接演示了一个Modbus功能。
S7-1500 CPU 的第一个连接作为Modbus TCP 客户机。S7-1200 CPU 作为 Modbus TCP 服务器。
S7-1200 CPU 的第二个连接作为Modbus TCP 客户机。The S7-1500 CPU 作为 Modbus TCP 服务器。
Modbus/TCP 连接是要通过一对功能块建立的 (MB_CLIENT 和 MB_SERVER)
Modbus ASCII或RTU模式仅使用于标准的Modbus协议串行网络,它定义了在这些网络上连续传输的消息段的每一个字节,以及决定怎样将信息打包成消息域和如何解码等功能。
当控制器设为在Modbus网络上以ASCII模式通信时,在消息中每个8位(bit)的字节都将作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1s而不产生错误。
在ASCII模式下,消息以冒号(:)字符(ASCII码0x3A)开始,以回车换行符结束(ASCII码0x0D,0x0A)。消息帧的其他字段可以使用的传输字符是十六进制的0 9,A F。处于网络上的Modbus设备不断侦测 “:” 字符,当有一个冒号接收到时,每个设备进入解码阶段,并解码下一个字段(地址域)来判断是否是发给自己的。消息帧中的字符间发送的时间间隔最长不能超过1s,否则接收的设备将认为发生传输错误。
传输设备将Modbus报文放置在带有已知起始和结束电的消息帧中,这就要求接收消息真的设备在报文的起始处开始接收,并且要知道报文传输何时结束。另外还必须能够检测到不完整的报文,且能够清晰地设置错误标志。
在RTU模式中,消息的发送和接收以至少35个字符时间的停顿间隔为标志。实际使用中,网络设备不断侦测网络总线,计算字符间的停顿间隔时间,判断消息帧的起始点。当接收到第一个域(地址域)时,每个设备都进行解码以判断时否时发给自己的。在最后一个传输字符结束之后,一个至少35个字符时间的停顿标定了消息的结束,而一个新的消息可以在此停顿后开始。另外,在一帧报文中,必须以连续的字符流发送整个报文帧。如果两个字符之间的空闲间隔大于15个字符时间,那么认为报文帧不完整,该报文将丢失。 简单来说,35个字符时间间隔的目的是作为区别前后两帧数据的分隔符 。
例如:
串口参数设置为1位起始位,8位数据位,1位校验位,1位停止位。这样1个字符就博爱阔11位,那么35个字符就是3511=385位。此时波特率设置位9600bps,即每秒传输数据为9600个位的数据。那么换算一下,385个二进制位数据需要的时间就是385(1000/9600)=40104167ms。那么在波特率9600bps的情况下,相邻的两帧数据的起始和结束之间至少有≥40104167ms的时间间隔。
为了时间RTU通信中的时间间隔管理,定时器将引起大量的中断处理,在较高的通信波特率下将导致CPU沉重负担。为此,规定当波特率≤19200bps时,需要严格遵守时间间隔。在波特率>19200bps时,时间间隔使用固定值。
地址域即通信帧中的地址字段,内容为从设备地址。Modbus消息帧的地址域包含2个字符(ASCII模式)或者1个字节(RTU模式)。
从设备的地址是0~247(十进制),单个设备的实际地址范围是1~247,地址0作为广播地址。主设备发送消息时将从设备地址放到地址域中以便从设备识别此消息是否是发给自己的。从设备回复主设备时会将自己的地址放到回应消息的地址域中以便主设备识别是哪个从设备返回的数据。
功能吗用于表示消息帧的功能。功能码域由1个字节构成,取值范围为1~255(十进制)。从设备根据功能码执行相应的功能,执行完成后在响应消息帧中设置同样的功能码。如果出现异常,返回的消息帧中将功能码最高位(MSB)设置为1。
数据域存放功能码需要 *** 作的具体数据。数据域以字节为单位,长度可变。
在Modbus串行通信中,更具传输模式(ASCII和RTU)的不同,差错校验域采用了不同的校验方式。
在Modbus TCP/IP协议中,串行链路中的主/从设备分别演变位客户端/服务器端设备。
Modbus协议在TCP/IP上的实现实在TCP/IP协议层上的应用,它需要一个完整的TCP/IP协议栈作为支撑,Modbus TCP/IP服务器端通常使用端口502作为接收报文的端口。
为了便于传输或者提取各报文,保证报文传输的完整性,Modbus协议在应用数据单元(ADU)中引入了附加字段。如串行链路中的报文分隔符+LRC校验和时间间隔+CRC校验。同样的,在TCP/IP网络上的Modbus协议也引入了一个称为MBAP(Modbus Application Header)报文头的字段。
Modbus TCP/IP协议最大帧数据长度为260字节,其中字节0~6构成MBAP报头。
单元标识符
如果是Modbus服务器连接到Modbus+或Modbus串行链路子网,并通过一个网桥或网关配置这个服务器的IP地址,则Modbus单元标识符对识别连接到网桥或网关后的子网的从站设备是必须的。TCP连接中的目的IP地址识别了网桥本身的地址,而网桥则使用Modbus单元标识符将请求转交给正确的从站设备。
对单纯的Modbus TCP/IP设备来说,利用IP地址即可寻址Modbus服务器端设备,此时Modbus单元标识符是无用的,必须使用0xFF填充。当对直接连接到TCP/IP网络上的Modbus服务器寻址时,建议不要在“单元标识符”域使用有效的Modbus从站地址。
查询与响应报文举例
在Modbus TCP/IP模式下,不需要校验字段。但在特殊场合,例如串行Modbus协议转Modbus TCP的情况下,串行协议数据可以完整的装在到Modbus TCP协议的数据字段,这时CRC或者LRC差错校验字段仍然存在。例如Modbus RTU Over TCP/IP或modbus ASCII Over TCP/IP等。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)