工况:MODBus从站采用的是现场仪表,主站采用M218控制器,通讯协议:MODBus RTU。
问题:现场仪表读数的数据格式为REAL值,及连续的两个WORD。我将数值通过MODBus RTU读出,写入连续的%MW地址内,但没有在SoMachine中找到将两个16位地址组合成一个32位REAL值的语句。求助各位高手!
另:将从站中数据乘以10 转换成WORD值,再用MODBus读出,转换成REAL值,再除以10这种方法,还有DWORD_TO_REAL这种方法就不用说了!现场仪表已经程序固化,通讯地址及格式固定,无法更改。我需要的是寄存器的数据如实反映,不要进行数学加工有数据精度损失。
其实这个原理很简单,如果用PC完成很简单,用触摸屏可以直接识别,但是SoMachine中我一直没有找到类似的语句,哪位高手有过类似问题,如何解决的请教了!
我的邮箱:alongz@163.com QQ:6634308
引用 张振龙 的回复内容:举例说明:我将现场仪表的REAL格式数值通过MODBus RTU读入两个连续的地址 %MW100、%MW101,这时我需将将这个REAL值写入一个变量REAL型变量:Var_Real_1,请问如何实现?或者按照二楼的说法“直接监控REAL值”,您在监控窗口中如何表示想要监视的数据,或者换个说法:想要监视的REAL型变量在监控窗口中监视变量怎么写?
你可以再全局变量表中,定义变量PV, 指定地址 %MD100( 由 %MW100,%MW101组成), REAL 类型一定是32位数据, 然后,通过MODBus RTU读入两个连续的地址 %MW100、%MW101, 接着就可以监控了,选择监控数据类型为REAL ,若是数据不对,一定是字节序反了,把 高低字 交换一下(用与或 逻辑指令即可实现),赋值为%MD110 , 即可观察到 REAL 数据了。。。
思路问题:不要尝试用某个语句进行转换,这种方法,是行不通的!我一开始也是这个思路,卡住了!
解决方案:(例)
第一步:用“READ_Var”将需要的REAL型的头地址开始读入word型数组,假设定义:RevBuffer为Array【0..9】 of word。
第二步:定义5个REAL型变量,假设Var_REAL_0 至Var_REAL_4 地址:%MD20 至 %MD24。
第三步:采用MOVE指令:RevBuffer【0】->move->%MW40 (注意,%MD20的高16位的头地址是%MW40,即:MD地址乘2是MW地址),RevBuffer【1】->move->%MW41 ,其他依次类推。
第四步:这时你直接使用Var_REAL_0 至Var_REAL_4就可以了!
这种方法的主要思路有两点:
1、对地址进行操作;
2、也是最关键的一点,不采用任何的语句,定义变量直接定义成REAL型,然后直接将高、低16位数据写入数值,这样没有任何转换语句,没有数据损失。
核心:通过REAL型变量定义、和直接对地址的操作完成了数据传递和转换。