Micro 'n Power V1.0 中modbus通讯例程,(读取浮点数)怎么通讯不了呢?问题已经解决。

已锁定

hane

  • 帖子

    101
  • 精华

    0
  • 被关注

    6

论坛等级:游侠

注册时间:2011-02-04

普通 普通 如何晋级?

Micro 'n Power V1.0 中modbus通讯例程,(读取浮点数)怎么通讯不了呢?问题已经解决。

2529

10

2013-08-19 09:52:26

例程复制过来,仪表9600,8,1,无校验, 地址30001,其他方式监测正常读取数据。
程序库存区已经按推荐值填写。
224XP,port0,
数据始终无法读出,这是怎么回事的?
谢谢大家指导!!!

ORGANIZATION_BLOCK 主程序:OB1
TITLE=
BEGIN


Network 1
// 第一扫秒周期, 复位各标志位和起始位
LD SM0.1
R M2.0, 8
R M4.0, 8
R M0.0, 2


Network 2
// modbus 主站初始化完成后, 启动读写指令
LD M0.0
EU
S M0.1, 1


Network 3 // 网络标题
//
//
LD SM0.0
= L60.0
LD SM0.0
= L63.7
LD L60.0
CALL SBR1, L63.7, 9600, 0, 1000, M0.0, MB1



Network 4
//
//
LD M0.1
O M2.3
= L60.0
LD M0.1
EU
LD M2.3
EU
OLD
= L63.7
LD L60.0
CALL SBR2, L63.7, 3, 0, 30001, 1, &VB1000, M2.1, MB3


Network 5
// 读取从站保持寄存器的数据完成,复位请求
LD M2.1
R M2.3, 1
R M0.1, 1


Network 6
// 读取从站输入点
LD M2.1
= L60.0
LD M2.1
EU
= L63.7
LD L60.0
CALL SBR2, L63.7, 4, 0, 30001, 1, &VB2000, M2.2, MB4


Network 7
// 读取从站输入点完成,复位请求
LD M2.2
R M2.1, 1


Network 8
// 写从站实际输出值
LD M2.2
= L60.0
LD M2.2
EU
= L63.7
LD L60.0
CALL SBR2, L63.7, 4, 1, 40001, 1, &VB3000, M2.3, MB5


Network 9
// 写从站实际输出值完成,复位请求
LD M2.3
R M2.2, 1
END_ORGANIZATION_BLOCK






SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=
BEGIN
Network 1
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK MBUS_CTRL:SBR1
TITLE=本代码归西门子能源与自动化公司专有,它属于附加软件包“modbus 主站端口 0 库”的一部分。
VAR_INPUT
Mode:BOOL; // 1 = modbus, 0 = PPI(终止 modbus

Baud:DWORD; // 1200, 2400 ... 115200
Parity:BYTE; // 0 = 无,1 = 奇校验,2 = 偶校验
Timeout:INT; // 以毫秒表示的从站响应超时

END_VAR
VAR_OUTPUT
Done:BOOL; // 完成标记(始终设置)

Error:BYTE; // 错误状态

END_VAR
VAR
AC0save:DWORD;
AC1save:DWORD;
AC2save:DWORD;
AC3save:DWORD;
END_VAR
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。

END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK MBUS_MSG:SBR2
TITLE=本代码归西门子能源与自动化公司专有,它属于附加软件包“modbus 主站端口 0 库”的一部分。
VAR_INPUT
First:BOOL; // 新消息(设置为 1 时仅对新请求扫描一次)
Slave:BYTE; // 从站地址(0 到 247)
RW:BYTE; // 读 = 0,写 = 1
Addr:DWORD; // modbus 地址(即 40001)
Count:INT; // 元素个数(1 到 120 个字或 1 到 1920 位)
DataPtr:DWORD; // 数据指针(即 &VB100)

END_VAR
VAR_OUTPUT
Done:BOOL; // 完成标记(0 = 忙,1 = 完成)
Error:BYTE; // 错误(0 = 无错误)
END_VAR
VAR
AC0save:DWORD;
AC1save:DWORD;
AC2save:DWORD;
END_VAR
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。

END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK MBUSM1:SBR3
TITLE=本代码归西门子能源与自动化公司专有,它属于附加软件包“modbus 主站端口 0 库”的一部分。
VAR_OUTPUT
crc:WORD;
END_VAR
VAR
count:INT;
ptr:DWORD;
END_VAR
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。

END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=中断程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
END_INTERRUPT_BLOCK
INTERRUPT_BLOCK MBUSM2:INT1
TITLE=本代码归西门子能源与自动化公司专有,它属于附加软件包“modbus 主站端口 0 库”的一部分。
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。

END_INTERRUPT_BLOCK

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
问题已经查出来了。
200PLC读取地址时会识别最前面一位数字,来确定减多少后才是真实读取的地址。
测试过程:
只写一个读取指令,用modbus 串口监控软件,看其读取数据。
--------------------------------------------------
Micro 'n Power V1.0 中内容:
modbus 地址 读/写 modbus 从站须支持的功能
00001 - 09999 数字量输出 读 功能 1
写 功能 5:写单输出点
功能 15:写多输出点
10001 - 19999 数字量输入 读 功能 2
写 -
30001 - 39999 输入寄存器 读 功能 4
写 -
40001 - 49999 保持寄存器 读 功能 3
写 功能 6:写单寄存器单元
功能 16:写多寄存器单
----------------------------------------------------
监控了一组:
02 01 00 02 00 04 9c 3a
02地址
01功能码
00 02读取地址——这里通讯的地方写3,对应的是0xxxx,所以减成2了。
00 04 线圈数——数据长度
9c 3a校验
------------------------------------------------------
监控另外一组:
02 04 00 02 00 02 d0 38
------------------------------------------------------

具体操作过程:
把程序下载PLC,取消仪表连接,用串口监控单次读取数据。
类似方法可以用来判断其他仪表数据读取是否正常。
Micro 'n Power V1.0 中modbus通讯例程,(读取浮点数)怎么通讯不了呢?问题已经解决。 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200

共有33257条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。