mcgs字符串提取 点击:3796 | 回复:12



wangpeng_521

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 5回
  • 年度积分:0
  • 历史总积分:19
  • 注册:2011年4月12日
发表于:2013-09-28 11:03:18
楼主

设备采用莫迪康Modbus-RTU,在屏上设置下位机的IP地址,比如输入 “192.168.1.1”,需要将字符串中的IP地址转换成16进制数据,再传给下位机。但是现有的字符串提取函数好像不能实现,请问大家有什么好的方法吗?(PS:如果要支持C语言,那就很简单了)。




Maybe境界

  • 精华:0帖
  • 求助:5帖
  • 帖子:6帖 | 26回
  • 年度积分:0
  • 历史总积分:51
  • 注册:2013年6月14日
发表于:2013-09-28 16:33:55
1楼

如果下位机那边是你决定的话,取4个寄存器,分别对应IP的4个数字,然后屏那边通过!Mid(str,n,k)把IP的4个数字给4个字符型变量,再用!lVal(str) 将4个字符型变量转化成数值,传给上面4个寄存器

只是一个想法

wangpeng_521

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 5回
  • 年度积分:0
  • 历史总积分:19
  • 注册:2011年4月12日
发表于:2013-09-28 20:01:55
2楼

您好,下位机是我编写的,您说的我也想到了。比如IP 192.168.1.1和192.168.101.1,随着IP地址的变化,我无法判断'.'在字符串中的偏移地址,!Mid(str,n,k)就无法提取了

Maybe境界

  • 精华:0帖
  • 求助:5帖
  • 帖子:6帖 | 26回
  • 年度积分:0
  • 历史总积分:51
  • 注册:2013年6月14日
发表于:2013-09-29 08:26:42
3楼

回复内容:

对: wangpeng_521 您好,下位机是我编写的,您说的我也想到了。比如IP 1... 内容的回复!


也就是说你可以改下位机的程序,那你可以这样:彩屏中就直接定义一个ANSCII字符串类型的通道,把字符型的IP地址传给通道,下位机那边需要定义连续的几个寄存器(比如8个)存储IP地址的ANSCII码,不过你要改通讯程序,就是在读这几个连续寄存器的首地址的时候返回内容为

"MCGSSTR:"+8个寄存器内的值,比如:

请求:0A 03 00 01 00 01 xx xx

下位机应答:0A 03 00 18 4D 43 47 53 53 54 52 3A 31 39 32 2E 31 39 32 2E 31 39 32 2E  31 39 32 xx xx

因为用统一的长度,变化的IP后面就是空格,然后再下位机中处理字符串

wangpeng_521

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 5回
  • 年度积分:0
  • 历史总积分:19
  • 注册:2011年4月12日
发表于:2013-09-30 08:40:06
4楼

回复内容:

对: Maybe境界 回复内容:对: wangpeng_521  您好,下位... 内容的回复!


Total_len = !len(String_IP)                                               '求字符串String_IP总长度

value_a = !lVal(String_IP)                                                '将字符串转换成整形变量

StringB = !right(String_IP,Total_len - !len(!Str(value_a)) - 1)           '将第一个8位变量和'.'剔除掉


Total_len = !len(StringB)                                                 '求字符串StringB总长度

value_b = !lVal(StringB)                                                  '将字符串转换成整形变量

StringC = !right(StringB,Total_len - !len(!Str(value_b)) - 1)             '将第二个8位变量和'.'剔除掉


Total_len = !len(StringC)                                                 '求字符串StringC总长度

value_c = !lVal(StringC)                                                  '将字符串转换成整形变量

StringD = !right(StringC,Total_len - !len(!Str(value_c)) - 1)             '将第三个8位变量和'.'剔除掉

 

value_d = !lVal(StringD)                                                  '将字符串转换成整形变量


LIP = value_a * 16777216 + value_b * 65536 + value_c * 256 + value_d


后来编写了叫脚本,暂时能实现了


Maybe境界

  • 精华:0帖
  • 求助:5帖
  • 帖子:6帖 | 26回
  • 年度积分:0
  • 历史总积分:51
  • 注册:2013年6月14日
发表于:2013-09-30 08:59:19
5楼

回复内容:

对: wangpeng_521 回复内容:对: Maybe境界  回复内容:对: wa... 内容的回复!


!len(!Str(value_a)),将字符串转换成整型在换成字符串,这一步不怎么懂,盲区

wangpeng_521

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 5回
  • 年度积分:0
  • 历史总积分:19
  • 注册:2011年4月12日
发表于:2013-09-30 11:00:31
6楼

回复内容:

对: Maybe境界 回复内容:对: wangpeng_521  回复内容:... 内容的回复!


假设IP地址结构  A.B.C.D

!len(!Str(value_a))是为了判断A的长度,然后才能取下一个字符串

Maybe境界

  • 精华:0帖
  • 求助:5帖
  • 帖子:6帖 | 26回
  • 年度积分:0
  • 历史总积分:51
  • 注册:2013年6月14日
发表于:2013-09-30 11:25:16
7楼

回复内容:

对: wangpeng_521 回复内容:对: Maybe境界  回复内容:对: wa... 内容的回复!


我就是不明白怎么判断A的长度的

=>value_a是IP字符串的整型表示

=>!Str(value_a)把IP字符的整型表示再转换成字符,结果是A.B.C.D

=>所以!len(!Str(value_a))求出来的长度还是总长度

不知道我认为的哪一环出了问题?

wangpeng_521

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 5回
  • 年度积分:0
  • 历史总积分:19
  • 注册:2011年4月12日
发表于:2013-09-30 12:11:34
8楼

回复内容:

对: Maybe境界 回复内容:对: wangpeng_521  回复内容:... 内容的回复!


value_a = !lVal(String_IP)   '将字符串转换成整形变量

经过这个转换,value_a = A,而不是A.B.C.D

rD无心

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2013年7月23日
发表于:2013-10-26 15:39:49
9楼

可以不过要最新版本的 STEP7 5.5

ozoner

  • 精华:0帖
  • 求助:0帖
  • 帖子:17帖 | 848回
  • 年度积分:69
  • 历史总积分:8584
  • 注册:2017年1月12日
发表于:2017-10-25 18:26:30
10楼

学习了, 谢谢分享。。。。。

  • 精华:0帖
  • 求助:3帖
  • 帖子:4帖 | 21回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2004年2月19日
发表于:2019-01-10 11:25:06
11楼

Server_IP_Read_Return = "192.168.01.123"


ip_str_len = !len(Server_IP_Read_Return)

dot_pos = !InStr(1,Server_IP_Read_Return,".")

left_str = !Left(Server_IP_Read_Return,dot_pos-1)

Server_IP_Setting0 = !Val(left_str)


Server_IP_Read_Return = !right(Server_IP_Read_Return,ip_str_len - dot_pos )

dot_pos = !InStr(1,Server_IP_Read_Return,".")

left_str = !Left(Server_IP_Read_Return,dot_pos-1)

Server_IP_Setting1 = !Val(left_str)


ip_str_len = !len(Server_IP_Read_Return)

Server_IP_Read_Return = !right(Server_IP_Read_Return,ip_str_len  - dot_pos )

dot_pos = !InStr(1,Server_IP_Read_Return,".")

left_str = !Left(Server_IP_Read_Return,dot_pos-1)

Server_IP_Setting2 = !Val(left_str)


ip_str_len = !len(Server_IP_Read_Return)

Server_IP_Read_Return = !right(Server_IP_Read_Return,ip_str_len - dot_pos )

Server_IP_Setting3 = !Val(Server_IP_Read_Return)



热门招聘
相关主题

官方公众号

智造工程师