威纶通官方论坛

维纶与仪表modbus

[复制链接]
发表于 2014-2-10 16:20:16 | 显示全部楼层 |阅读模式
用数值显示元件来显示仪表某一个地址的内容,但维纶接收两个连续字节内容并显示,而仪表的每一个地址都代表一个参数。如何在维纶上显示一个字节的内容,麻烦师傅解答,谢了。
发表于 2014-2-10 16:23:22 | 显示全部楼层
仪表每一个地址是表示一个字节吗?

如果是,那就需要通过宏指令进行数据处理。
 楼主| 发表于 2014-2-11 08:55:24 | 显示全部楼层
麻烦提供案例,谢谢
发表于 2014-2-11 11:34:17 | 显示全部楼层
高低位宏.rar (11.03 KB, 下载次数: 376)
 楼主| 发表于 2014-2-12 12:55:12 | 显示全部楼层
我用宏指令读取仪表数据,LW100和LW101只能显示1到127,,128及以上显示****,是什么原因,麻烦解答,谢谢

macro_command main()
char command[32],response[32]
short address, checksum
short read_no,return_value,read_data[2]

FILL(command[0], 0, 32) // 初始化command[0]~command[31] to 0
FILL(response[0], 0, 32)

command[0] = 0x01 // 站号
command[1] = 0x03 // 读寄存器 (功能码是 0x03)

address = 0// 起始地址 (4x_1) 是0
HIBYTE(address, command[2])
LOBYTE(address, command[3])

read_no = 2// 总的寄存器数目为2
HIBYTE(read_no, command[4])
LOBYTE(read_no, command[5])

CRC(command[0], checksum, 6)// CRC校验计算
LOBYTE(checksum, command[6])
HIBYTE(checksum, command[7])

OUTPORT(command[0], "SB194E", 8)// 发送读命令
INPORT(response[0], "SB194E", 9, return_value)// 读取回复的命令

if (return_value >0 and response[1] == 0x3) then
read_data[0] = response[4] + (response[3] << 8)// 计算4x_1的数据
read_data[1] = response[6] + (response[5] << 8)// 计算4x_2的数据

SetData(read_data[0]," Local HMI", LW, 100, 2)//计算后的数据送到触摸屏上来显示
end if

end macro_command
 楼主| 发表于 2014-2-12 12:58:47 | 显示全部楼层
还有麻烦解释下面的语句
read_data[0] = response[4] + (response[3] << 8)// 计算4x_1的数据
为何要 << 8
发表于 2014-2-14 09:25:27 | 显示全部楼层
数据定义使用无符号的数据格式,unsigned short、unsigned char.

read_data[0] = response[4] + (response[3] << 8)// 计算4x_1的数据
为何要 << 8

意思是:response[4] 为16位数据的低8位数据    response[3] 为它的高8为数据。所以要高8位左移8位+低8位组成一个16位数据。
您需要登录后才可以发帖 登录 | 注册

本版积分规则

回复帖子

Archiver|小黑屋|威纶通官网 ( 粤ICP备06054553号 )

GMT+8, 2024-11-30 03:36

Powered by Discuz! X3.4

© 2001-2023 Comsenz Inc.

快速回复 返回顶部 返回列表