首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PLC/Modbus读取线圈状态(modbus tk)

PLC/Modbus读取线圈状态(modbus tk)
EN

Stack Overflow用户
提问于 2016-11-07 23:55:02
回答 2查看 1K关注 0票数 0

希望有一个无聊的PLC modbus专家在外面需要一些娱乐..我都快疯了想要弄清楚这件事。

我正在尝试读取东元SG2 20VR-D上输出线圈Q1至Q8的状态。

我在python中使用Modbus-TK,我可以很容易地与plc通信,以写入线圈,读取寄存器等。但我不能弄清楚如何读取输出线圈Q1-Q8,以便我可以检查它们的状态。

地址表位于所附PDF的第29/31页。我的设备是V3类型的。

如果你阅读了第29页的小字体,会有一些关于乘以10h的神秘信息?帮助!

当我使用这个命令时,我得到一个简单的元组,唯一的值为零。

代码语言:javascript
复制
slave_address = 1

command = 1 #read coils

coil_address = 11312 # this is 2c30h converted to decimal.  2c30h is the address for Q1 according to the pdf

master.execute(slave_address, command, coil_address)

(当我在Pycharm中计算表达式时..这是我得到的)返回:

代码语言:javascript
复制
result = {tuple} <type 'tuple'>:()
__len__ = {int} 0

问题是Q1是通电的(关闭的),所以它应该显示1或65280而不是0,所以这不可能是正确的。

我应该为线圈地址使用某种范围吗?有谁能解释一下应该如何做到这一点?

Teco SG3 Modbus Manual

EN

回答 2

Stack Overflow用户

发布于 2016-11-08 01:05:47

我一点也不熟悉您在做什么,但是快速浏览一下文档就会发现,您并没有为READ_COILS命令指定所有需要的参数-还有一个"quantity_of_x“参数(对于这个特定命令,要读取的线圈数),modbus-tk的缺省值为0。因此,您请求的是总共零个线圈的值,这与您得到的结果完全匹配。这个参数显然需要是0x10的倍数,所以您需要请求的不仅仅是Q1-Q8的值--其他八个值都是垃圾。

票数 1
EN

Stack Overflow用户

发布于 2016-11-08 01:14:49

01H:用户设置起始地址等于10H的倍数,线圈数量也等于10H的倍数

Modbus实现通常需要一个完整的寄存器值(我想是您正在使用的值)或一个偏移量。在这种情况下,您是否尝试通过将基址寄存器乘以16 (10h)来获得偏移量?

你有没有试着从传出和传入的消息中寻找线索?Wireshark将自动为您分解Modbus消息。

我没有给你一个直接的答案,因为每个modbus实现都有一点不同,所以有很多这样的东西你必须自己深入研究。

我不知道你的技术水平,但我会首先从取证的角度分析wireshark中的消息(字节),以找出设备返回的确切内容,并验证您正在发送的内容。此信息也可能对您有所帮助:

http://support.autosoln.com/support/index.php?/Knowledgebase/Article/View/63/0/modbus-protocol-overview-debugging-your-acm-configuration-by-dissecting-modbus-messages

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40469264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档