SoMachine中如何将两个%MW(即:WORD值)组合成一个REAL值的语句? 点击:7738 | 回复:16



张振龙

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 9回
  • 年度积分:0
  • 历史总积分:52
  • 注册:2003年10月29日
发表于:2012-10-08 22:49:00
楼主

工况: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




miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2012-10-09 11:34:22
1楼

现场仪表数据的格式为 REAL ,那么你读取上来的 连续2个字的数据,直接在SoMachine中监控 REAL 格式,看看对不对? 如果不对,很可能是字节序反了,调换 高低字 ,后,再监控数据的 REAL 格式值,应该就和仪表一致了。

 

不需要你 “在SoMachine中找到将两个16位地址组合成一个32位REAL值的语句。”

lxhhl258

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 35回
  • 年度积分:0
  • 历史总积分:117
  • 注册:2008年11月16日
发表于:2012-10-09 22:50:30
2楼

我也遇到了相同的问题,电话打给施耐德售后要么不知道,要么忙!

lxhhl258

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 35回
  • 年度积分:0
  • 历史总积分:117
  • 注册:2008年11月16日
发表于:2012-10-09 23:03:55
3楼

高手,能否详细一点!

张振龙

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 9回
  • 年度积分:0
  • 历史总积分:52
  • 注册:2003年10月29日
发表于:2012-10-09 23:42:58
4楼

举例说明:

我将现场仪表的REAL格式数值通过MODBus RTU读入两个连续的地址 %MW100、%MW101,这时我需将将这个REAL值写入一个变量REAL型变量:Var_Real_1,请问如何实现?

或者按照二楼的说法“直接监控REAL值”,您在监控窗口中如何表示想要监视的数据,或者换个说法:想要监视的REAL型变量在监控窗口中监视变量怎么写?

 

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2012-10-10 09:51:03
5楼

引用 张振龙 的回复内容:举例说明:我将现场仪表的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 数据了。。。

 


 

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2012-10-10 09:53:17
6楼

这时我需将将这个REAL值写入一个变量REAL型变量:Var_Real_1,请问如何实现?

----------------------------

用MOVE 指令即可。。。。

张振龙

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 9回
  • 年度积分:0
  • 历史总积分:52
  • 注册:2003年10月29日
发表于:2012-10-10 13:35:33
7楼
对呀!我怎么没想到,真蠢!谢谢!

lxhhl258

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 35回
  • 年度积分:0
  • 历史总积分:117
  • 注册:2008年11月16日
发表于:2012-10-11 07:25:30
8楼

somachine 里貌似%md100 与%mw100,%mw101无关!

张振龙

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 9回
  • 年度积分:0
  • 历史总积分:52
  • 注册:2003年10月29日
发表于:2012-10-11 09:21:07
9楼
引用 lxhhl258 的回复内容: somachine 里貌似%md100 与%mw100,%mw101无关!

对,如果是%MW100和%MW101,那REAL型应该是%MD50。明白意思就行。

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2012-10-11 09:49:03
10楼

引用 lxhhl258 的回复内容:somachine 里貌似%md100 与%mw100,%mw101无关!



不管仕么PLC  地址一地是连续的, 所以 %MD100 == (%mw100,  %mw101)


呵呵,楼主不必 自责,有时候卡住了, 多问问,也许别人的一句话,就提醒了你。

所以每个人的思维方式不同,

lxhhl258

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 35回
  • 年度积分:0
  • 历史总积分:117
  • 注册:2008年11月16日
发表于:2012-10-11 16:58:51
11楼
引用 张振龙 的回复内容:引用 lxhhl258 的回复内容: somachine 里貌似%md100 与%mw100,%mw101无关! 对,如果是%MW100和%MW101,那REAL型应该是%MD50。明白意思就行。

我是过了,%mw100,%mw101,确实与%md50相关。但不能显示浮点数!

lxhhl258

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 35回
  • 年度积分:0
  • 历史总积分:117
  • 注册:2008年11月16日
发表于:2012-10-11 17:03:05
12楼

我用再用word_to_real也不行

 

lxhhl258

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 35回
  • 年度积分:0
  • 历史总积分:117
  • 注册:2008年11月16日
发表于:2012-10-11 17:04:04
13楼

我再用dword_to_real也不行

张振龙

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 9回
  • 年度积分:0
  • 历史总积分:52
  • 注册:2003年10月29日
发表于:2012-10-11 22:01:50
14楼
引用 lxhhl258 的回复内容: 我再用dword_to_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型变量定义、和直接对地址的操作完成了数据传递和转换。

 

 

 

lxhhl258

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 35回
  • 年度积分:0
  • 历史总积分:117
  • 注册:2008年11月16日
发表于:2012-10-12 07:55:31
15楼

多谢张振龙,按你的方法可以解决问题。

我在想,如果不用直接地址能否实现!

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:33
  • 注册:2017年8月12日
发表于:2019-09-05 10:00:31
16楼

使用WORD_AS_REAL 指令


热门招聘
相关主题

官方公众号

智造工程师