找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
问题
取消精华
首页精华问答
取消推荐
高端用户推荐
申请置评
已申请置评
修改
修改标签
添加标签
官方认证
取消官方认证
修改标签
添加标签
转移分类
删除
{{itemCategory}}
附:第三方设备发送文本的地址从40051开始,200SMART侧编程从40052开始连续读取4个字(考虑到姓名一般最多4个汉字),存放至&VB100。
收藏({{answerDetail.Q_FavoriteCounts}})
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
专家建议
取消最佳答案
修改
仅供参考吧。
步骤1:Modbus RTU读取数据
配置Modbus主站:使用MBUS_MSG指令从设备地址40052开始读取4个字(8字节),数据存储到VW100开始的区域(即VW100、VW102、VW104、VW106)。
每个字(16位)对应两个字节(高字节在前,低字节在后)。
步骤2:拆分字为字节
拆分每个字的高/低字节:将每个VW字拆分为高字节和低字节,存储到连续字节区域(如VB200开始的8字节)。
// 拆分VW100到VB200和VB201
MOV_B VB100, VB200 // VW100高字节 -> VB200
MOV_B VB101, VB201 // VW100低字节 -> VB201
// 拆分VW102到VB202和VB203
MOV_B VB102, VB202 // VW102高字节 -> VB202
MOV_B VB103, VB203 // VW102低字节 -> VB203
// 拆分VW104到VB204和VB205
MOV_B VB104, VB204 // VW104高字节 -> VB204
MOV_B VB105, VB205 // VW104低字节 -> VB205
// 拆分VW106到VB206和VB207
MOV_B VB106, VB206 // VW106高字节 -> VB206
MOV_B VB107, VB207 // VW106低字节 -> VB207
步骤3:过滤无效字节(可选)
处理WChar高字节:如果WChar为ASCII字符(高字节为0),仅保留低字节:
// 假设高字节为0,取低字节存入VB300开始的位置
MOV_B VB201, VB300 // 第1个有效字符
MOV_B VB203, VB301 // 第2个有效字符
MOV_B VB205, VB302 // 第3个有效字符
MOV_B VB207, VB303 // 第4个有效字符
步骤4:拼接为String
构建String格式:西门子S7-200 SMART的String格式为:首字节是长度,后续为字符。
// 设置字符串长度(假设有效字符为4)
MOV_B 4, VB400 // VB400为字符串长度
// 填充字符到VB401开始的区域
MOV_B VB300, VB401 // 第1字符
MOV_B VB301, VB402 // 第2字符
MOV_B VB302, VB403 // 第3字符
MOV_B VB303, VB404 // 第4字符
完整梯形图示例
// 主程序:读取Modbus数据
NETWORK 1
LD SM0.1 // 首次扫描初始化
CALL MBUS_CTRL, SBR1 // 初始化Modbus主站
NETWORK 2
LD M0.0 // 触发读取条件
CALL MBUS_MSG, SBR2 // 读取40052开始的4个字到VW100
// 拆分字为字节
NETWORK 3
LD SM0.0
MOV_B VB100, VB200
MOV_B VB101, VB201
MOV_B VB102, VB202
MOV_B VB103, VB203
MOV_B VB104, VB204
MOV_B VB105, VB205
MOV_B VB106, VB206
MOV_B VB107, VB207
// 过滤高字节(假设高字节为0)
NETWORK 4
LD SM0.0
MOV_B VB201, VB300 // 第1字符
MOV_B VB203, VB301 // 第2字符
MOV_B VB205, VB302 // 第3字符
MOV_B VB207, VB303 // 第4字符
// 构建String
NETWORK 5
LD SM0.0
MOV_B 4, VB400 // 字符串长度=4
MOV_B VB300, VB401 // 填充字符
MOV_B VB301, VB402
MOV_B VB302, VB403
MOV_B VB303, VB404
注意事项
编码兼容性:若WChar为中文(如Unicode),需额外转换(如Unicode转GBK),需使用查表法或调用自定义算法。
数据对齐:确保Modbus读取的寄存器地址与设备定义一致,避免偏移错误。
字符串终止符:200 SMART的String无需终止符,长度由首字节明确。
问题补充:
通过字节拆分指令将WChar的高/低字节分离,并存入临时缓冲区:
// 假设汉字WChar存储在VW100(示例地址)
MOVW VW100, VW200 // 将WChar值复制到临时区
SPLIT VW200, VB201, VB202 // 拆分高字节(VB201)和低字节(VB202)
说明:
SPLIT指令可将字(16位)拆分为两个独立字节。
若PLC无SPLIT指令,可用移位操作替代:
MOVW VW100, VW200
SRW VW200, 8 // 右移8位获取高字节至VB201
ANDW VW200, 16#00FF // 掩码保留低字节至VB202
构建字符串缓冲区
初始化字符串长度:
MOVB 8, VB10 // 假设4个汉字(4×2字节),长度设为8
填充字符内容:
MOVB VB201, VB11 // 第1个汉字高字节
MOVB VB202, VB12 // 第1个汉字低字节
MOVB VB203, VB13 // 第2个汉字高字节(假设后续WChar在VW102)
MOVB VB204, VB14 // 第2个汉字低字节
// 重复操作填充全部汉字
使用SCAT指令拼接字符串
若需动态生成字符串(如根据实际汉字数量调整长度),使用SCAT指令合并多个字符段
// 示例:将4个WChar转换为字符串(VB10为起始地址)
SCAT "字1高字节", VB10 // 假设"字1高字节"已存储在VB11
SCAT "字1低字节", VB10
SCAT "字2高字节", VB10
SCAT "字2低字节", VB10
// 重复至所有汉字拼接完成
编码兼容性处理
检查字符集:确保PLC与第三方设备使用相同编码(如GB2312或UTF-16)。
转码验证:通过HMI显示转换后的字符串,确认无乱码。
等您来回答
换一换
{{item.CoinValue}}西币
{{item.VisitNum}}人想问
本版相关问题
换一换
专家置评
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!

西门子商城