ModbusTCP通讯错误的排查

Modbus是一种由MODICON公司开发的工业现场总线协议标准,是一项应用层报文传输协议。该协议用于传输数字和模拟变量[1]。有关该协议的报文具体格式,以及一些基本概念,见[1]。

本文以一个例子,阐述当ModbusTCP通讯出现错误的时候,排查错误的方式。

一、例子说明

这里将Arduino Opta PLC作为ModbusTCP从站。Arduino Opta PLC运行时,默认开启了Modbus TCP从站功能[2]。其设置的方式见[2]。这里,Arduino Opta PLC的网络设置如下:

// shared variables can be accessed with PLCIn.varname and PLCOut.varnamevoid setup()
{// Configure static IP addressIPAddress ip(192, 168, 1, 90); //so ip is 192.168.1.90IPAddress dns(192, 168, 1, 1);IPAddress gateway(192, 168, 1, 1);IPAddress subnet(255, 255, 255, 0);// If cable is not connected this will block the start of PLC with about 60s of timeout!Ethernet.begin(ip, dns, gateway, subnet);}void loop()
{}

而笔记本电脑作为ModbusTCP主站,IP设置如下:

笔记本电脑和PLC通过RJ45网线连接。

在Arduino Opta PLC上,ModbusTCP从站的离散输入(discrete input)和线圈(coil)已有内置的变量和它们对应[2]。

而输入寄存器(Input register)对应的变量在Status variable中

保持寄存器(Holding register)对应的变量在Parameters中

二、错误分析和修正

现在,使用电脑上的ModbusClientX软件作为主站和PLC进行通讯。该软件在[3]可下载。

在这里输入Modbus从站,即Arduino Opta PLC的ip地址和端口,点击Connect即可完成连接

目前连接成功,但当尝试点击“Read from 0 to 9”读取数据时,出现了如下错误:

对于ModbusTCP方面的错误,建议从Modbus的报文入手,即通过网络调试助手,通过TCP/IP协议连接ModbusTCP从站的PLC,发送报文,观察返回的报文。这里推荐NetAssist软件[4]。

根据[1]中的提示,要读取从地址0开始的10个离散输入,应当发送的报文是“00 01 00 00 00 06 01 02 00 00 00 12”。所以将这句报文键入NetAssist。

(一)报文形式

返回的信息是报错信息。经分析,发现刚才发送的信息没有以16进制解读,而是以ASCII码解读,导致Modbus从站接收了错误信息。故将发送设置里由ASCII改为HEX。使用NetAssist或其它网络调试助手时,要注意发送报文是16进制报文还是ASCII字符串,这两者是完全不同的。

(二)从站设备号

很遗憾,还是出现了错误的返回。通过阅读[2]中的内容,主要是Modbus TCP Client Opta™那一节,发现ModbusTCP从站设备除了有IP地址和端口外,还有设备号,通常在1和255之间,Arduino Opta PLC设备的ModbusTCP从站设备号是255。

在ModbusTCP报文中,报文头MBAP中的最后一个字节是设备号[1],对于该PLC而言是16进制的FF,即255。

所以报文内容应为“00 01 00 00 00 06 FF 02 00 00 00 12”

第三行是返回的值。除MBAP报文头外,信息从02开始,02表示功能码,03表示数据长度为3个字节,之后的00 00代表数据均为0。

在写有Button Inputs Mapping的图中,可见一个叫btn的变量代表了PLC上的一个按钮是否按下,且它对应了ModbusTCP的一个离散输入。当按下按钮后,btn值会变1。

此时,从地址01开始,读取8个离散输入,得到以下结果:

返回的报文中,最后的3个字节,02表示功能码,01表示1个字节,08是数据,对应得2进制是00001000,也就是说第4个离散量输入是1,其余是0。

同样的,PLC的指示灯输出也有ModbusTCP的线圈和它们对应。可参见带有“LED outputs mapping"的图。

现在,用写线圈的报文,把LED灯的变量设为1。这里写在地址0x05

(三)寄存器地址的偏移

关于输入寄存器,在Status variables图中可知,在地址0x6001有一个叫做cnt的变量。所以,现在用读取输入寄存器的报文读出该变量。

从回复中可看出,数据未能读取,出现错误。原因在于寄存器地址的偏移。在Arduino Opta PLC中,地址为0x6001的变量,在ModbusTCP的输入寄存器中,实际地址为0x6000。

读出的数据为0xD82A,在十进制中为-10198。

不同的PLC会有不同的偏移量,有的PLC无偏移量,有的PLC会有1个偏移量,或者其它情况。建议尝试不同的地址找到偏移规律。

同样的,若要写入保持寄存器,即Parameters,也可用ModbusTCP报文。这里将位于0x4001的parameter写为0x32F1,即13041。

该变量被写入。位于0x4001的变量,在保持寄存器中的地址也是0x4000。

三、小结

总之,对于ModbusTCP通信中出现的错误,建议通过NetAssist等网络调试软件研究具体的报文,发现错误。首先要确保报文是HEX即16进制格式;另外,要注意ModbusTCP的从站除了IP地址和端口号外,还有设备号,不一定为1;对于寄存器,也包括离散输入和线圈,要考虑不同的PLC可能的地址偏移,即设备内存地址和ModbusTCP地址之间的偏移。

参考资料

[1]ModbusTCP协议 - ioufev - 博客园

[2]Modbus TCP On Opta™ Using PLC IDE

[3]ModbusClientX - Modbus Tool

[4]NetAssist网络调试助手下载_NetAssist5.0.2官方最新版下载 - 系统之家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147173.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

01_RabbitMQ安装及工作模式

一、消息队列MQ 中间件 1.1 什么是消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)是一…

鸿蒙开发(NEXT/API 12)【跨设备互通开发】远场通信服务

跨设备互通提供跨设备的相机、扫描、图库访问能力,平板或2in1设备可以调用手机的相机、扫描、图库等功能。 场景介绍 您通过此能力实现跨设备交互,可以使用其他设备的相机、扫描和图库功能。 约束与限制 需同时满足以下条件,才能使用该功…

COLORmap

在这段MATLAB代码中,surf(peaks)、map的定义以及colormap(map)的调用共同完成了以下任务: 1. **绘制曲面图**: - surf(peaks):这个函数调用了MATLAB内置的peaks函数来生成数据,并使用surf函数将这些数据绘制成一个…

CSS 选择器的分类与使用要点二

目录 非 VIP 用户可前往公众号进行免费阅读 标签选择器 id 选择器 类选择器 介绍 公共类 CSS 中优先用 class 选择器,慎用 id 选择器 后代选择器 交集选择器 以标签名作为开头 以类名作为开头 连续交集 并集选择器(分组选择器) 通配符* 儿子选择器 >(IE7…

CSS 的继承性、层叠性与权重问题解析

目录 非 VIP 用户可前往公众号进行免费阅读 继承性 层叠性 CSS的权重问题 如果权重一样,以后出现的为准 以权重大的为准 没有选中,权重为0,就近原则 权重只和css顺序有关 非 VIP 用户可前往公众号进行免费阅读 CSS 的继承性、层叠性与权重问题解析本文主要介绍了 C…

AIGC8: 高通骁龙AIPC开发者大会记录B

图中是一个小男孩在市场卖他的作品。 AI应用开发出来之后,无论是个人开发者还是企业开发者。 如何推广分发是面临的大问题。 做出来的东西一定要符合商业规律。否则就是实验室里面的玩物,或者自嗨的东西。 背景 上次是回顾和思考前面两个硬件营销总的…

解决Python Debug没有反应的问题

应该有伙伴和我一样,用的2024版本的VS code,但是用到的python解释器是3.6.x,或者是更旧版本的Python. 想要进行Debug就会在扩展里面安装 一般安装就会安装最新版本,但是debug时又没有反应,其主要原因是Python的版本与…

Gin框架入门(2)--异常捕获与日志实现

异常捕获 Go语言的异常捕获采用的是延迟处理的方法实现的,实际上就是利用defer,panic和recover三个关键字和函数来实现的。 关键字 defer关键字(函数) 这个关键字在控制语句中就有所涉及,本质上是采用一个栈的存储结构,在整个…

时钟的配置

在使用51单片机时,系统使用的时钟源是一个外部晶体振荡器,频率为12M。由于51单片机每个指令周期都是12分频的,所以实际工作频率仅为1M。2440作为一种性能远高于51的Soc,主频肯定要远远高于51,因此2440有着比51单片机复…

yolov8模型在Xray图像中关键点检测识别中的应用【代码+数据集+python环境+GUI系统】

yolov8模型在X yolov8模型在Xray图像中关键点检测识别中的应用【代码数据集python环境GUI系统】 1.背景意义 X射线是一种波长极短、穿透能力极强的电磁波。当X射线穿透物体时,不同密度和厚度的物质会吸收不同程度的X射线,从而在接收端产生不同强度的信号…

pycharm加载虚拟环境及运行代码

pycharm加载虚拟环境及运行代码 pycharm下载地址: https://www.jetbrains.com/pycharm/download/ 1.加载虚拟环境 选择pycharm图标,点击启动。 选择OPEN, 选择工程文件夹: 选择File->setting 选择python 解释器: Project--…

扫码挪车是怎么实现的呢?一篇文章带你了解一下!扫码挪车小程序基础版上线了!!!

挪车小程序系统源码的功能特点 快速定位与挪车请求:车主通过小程序可以快速定位车辆位置,并发送挪车请求。系统会自动将请求发送给附近的车主,提醒其尽快挪车。实时通信与交互:小程序支持实时通信功能,车主之间可以通…

【C++笔记】C++编译器拷贝优化和内存管理

【C笔记】C编译器拷贝优化和内存管理 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】C编译器拷贝优化和内存管理前言一.对象拷贝时的编译器优化二.C/C内存管理2.1练习2.2 C内存管理方式2.3 operator new与operator…

tornado

Tornado通过使用非阻塞网络1/0,可以扩展到数以万计的开放链接,非常适合 长时间轮询,WebSockets和其他需要与每个用户建立长期连接的应用程序。 特点 注重性能优越,速度快解决高并发异步非阻塞websockets 长连接内嵌了HTTP服务器…

十一、 JDK17 新特性梳理

文章目录 为什么是JDK17语法层面新特性1、文本块2 、Switch 表达式增强3、instanceof的模式匹配4、var 局部变量推导 模块化及类封装1、记录类 record2 、隐藏类 Hidden Classes3 、密封类 Sealed Classes4、模块化 Module System1 、什么是模块化2、声明一个module3 、require…

“智能密钥管家”IKE

IKE的出现 上一篇通过IPSec实现了BJ到CS的业务互通,但是是通过手工方式把加密和验证密钥手动配置,为了保障安全性,就需要经常去修改这些密钥,小型场景还好,来来回回就这2个点, 修改起来不算麻烦&#xff…

[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

解决SVN蓝色问号的问题

桌面或文件夹右键,选择TortoiseSVN->Settings打开设置对话框,选择Icon Overlays->Overlay Handlers->取消钩选Unversioned。确定,重启系统即可

CodeGeeX4:程序员的高效助手,多语言代码生成神器!

你是否曾在编写代码时,为复杂的语法、逻辑错误而绞尽脑汁?或是在面对多个编程语言的切换时,感觉脑子快要爆炸?别担心!一款全新的多语言代码生成神器——CodeGeeX4,正悄然成为程序员们的“救命稻草”。它不仅…

【工具变量】地市环保法庭试点城市DID数据集(2005-2023年)

数据简介:环保法庭是中国司法体系中专门处理环境资源案件的审判机构,其主要职责包括审理涉及自然环境污染、矿产资源保护、自然资源环境开发等环境资源民事纠纷案件,对不服下级人民法院生效裁判的环境资源民事案件进行审查,以及对…