请教各位老师,我的目的是想从触摸屏写入字符串到plc,我用的触摸屏是MCGS 1060hn作为上位机,与200smart采用ModbusRTU通讯,用该通讯是因为昆仑通态的屏不支持PPI或TCP通讯下写入字符串。
经过测试,字符串能够以ASCII码写入PLC中,但是没有用西门子特有的通讯协议,字节是反过来的(如图所示),如果我在PLC中用SWAP指令调换字节,也不能用SM0.0一直使能,这样会导致字节调换不停。用SM0.1使能SWAP指令也没有效果。
数据块中 我定义VB145为"ABCD",在屏写入ABCD,PLC中VB145显示BADC,在屏写入ABC,PLC中VB145显示AB。
第二步想实现写入汉字,屏厂家说是可以写入汉字的,但是PLC中的汉字在屏上显示为乱码,屏上写入的汉字在PLC中也显示乱码。
请教各位老师调换高低字节有没有好的方法。
写汉字的问题应该还要继续咨询屏厂家。
多谢指教。
图片说明:
最佳答案
要仔细分析产生问题的原因:
1、触摸屏与PLC采用Modbus RTU通信方式读写字符串,操作的是保持性寄存器,只能按“字”操作。
2、无论是字符、还是汉字在计算机上都编码存储的,字符通常以ASCII码存储,汉字以“国家标准编码,目前主要有GB2312、GBK、GB18030三种”存储,更复杂一点可能用到:Unicode编码,UTF8、UTF16编码等,但它们本质都是把某种符号或文字编程二进制数(序列)。
关于这一点,你可以定义一个字符串赋一个初值,然后按字节查看(而不是按变量类型查看),例如在PLC的数据块V区定义:VB0 "江山如画"。下载到PLC,在线观察:VB0=8(4个汉字占8个字节),VB1=189(BDH),VB2=173(ADH),VB3=201(C9h)VB4=189(BDH),VB5=200(C8),VB6=231(E7),VB7=187(BB),VB8=173(AD)采用GBK内码。
3、西门子PLC采用大端存储,高位数据存储在低地址编号的字节。如上图字符“江”的编码是BDAD。高位BD存在VB1(低地址),而低位AD存在VB2(高地址)。
出现你图片中所说的情况,可能在于触摸屏上对字符串的处理,与PLC不一致造成的。
4、MCGS触屏上的文本框输入“ABCD”是不可能直接指向modbus保持性寄存器地址如40001等的。可能要以脚本处理:例如触摸屏输入“ABCD”要在PLC侧正确显示,必须进行处理满足PLC对字符串的定义,如VB145=04H(字符个数)、VB146=41H(A的ASCII码)、VB147=42H(''B'')、VB148=43H(''C'')、VB149=44H(''D''),这需要建立映射关系如40001=0441H,40002=4243H,40003=44**H,而这需要在触摸屏上处理。
5、当然出现你说的问题,也可以在PLC处理。但文本任何时候都可能改写输入,因此PLC必须知道何时发生了改变,然后交换字节。检测改变比较麻烦。建议触摸屏脚本编程时直接按照PLC的规则处理到位。
提问者对于答案的评价:
谢谢
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc347071.html