wincc中C语言反转二进制变量,用wincc的脚本进行二进制位变量的位操作和判断

建立一个16位的wincc二进制位变量*,然后将S7的变量A,B,C。。。的值0/1按顺序放到*中,放完后了再和固定值比对,每个位数值不对都对应一个文字输出。用脚本怎么编了?

问题补充:

思路是这样的吧S7变量A,B,C等按顺序排列放入WINCC变量中成一个01110111.。。。。的数或字符串,然后与固定值11111111比较,第四位和第八位不同则分别同时输出两个文本。不一个个比较是因为变量多了后太庞大了。

最佳答案

在wincc中我习惯用字符串代替二进制变量,因为不然的话可能涉及到wincc与PLC数据类型匹配的问题,而且,字符串函数可以帮助我们直观快速地实现要求。

把PLC中的开关量(0/1)读回来,在脚本中用cstr变成字符串。

针对你的问题,如果你plc中是一连串的点,可以直接按字(八位)读上来,再换成二进制字符串。

如果你是在wincc中创建了一连串按规律命名的变量与plc变量相对应,比如在wincc中的变量A1-A10 对应你plc的A,B,C…十个变量,那么

dim i

dim strBin

strBin = ""

For i = 1 to 10 Step 1

strBin = Cstr(HMIRuntime.Tags("A"&cstr(i)),Read)&strBin

Next

”到此得到了你想要的二进制的字符串形式,如果strBin在下文中再无用了,那完全可以不建立这个变量。

For i = 1 to 10 Step 1

if Mid(strBin,i,1)<>Mid(你的固定值,i,1) then

Select Case i

Case 10  A1(A)不同时的文本

Case 9   A2(B)不同时的文本

End select

end if

Next

————————————————————————————————————————

以下是我程序中用到的一小段代码,节选的,主要用于讨论思路,dim什么的就省了。

For i = 3 To 14 Step 1

idec = Int(HMIRuntime.Tags ("I"&CStr(i)).Read) ”读八位开关量回来

ibinstr = ""

Do While idec > 0   ”转为二进制字符串

ibinstr = CStr(idec Mod 2) & ibinstr

idec = idec \ 2

Loop

If Len (ibinstr) <> 8 Then  ”补全八位

ibinstr = Left ("00000000",8 – Len (ibinstr)) & ibinstr

End If

binstrL = Right (ibinstr,4)

binstrH = Left (ibinstr,4)

”这里是对两个四位串操作,省略了

IGDSTR = Mid (binstrH,1,1)&Mid(binstrL,1,1)&IGDSTR ”获取每个四位串中的第一位

Next

Dim tc

tc = 0

For i = 1 To 24 Step 1

If Mid(IGDSTR,i,1) = "1" Then

tc = tc + 1  ”统计字符串中有多少个”"1"

End If

Next

提问者对于答案的评价:

希望多交流

最佳答案作者回复:

的确,如果变量较多,批量读回来统一处理的话,会耗费较长时间,而脚本运行系统不能并发处理,这就有可能在处理这些变量的时候,别的脚本本该触发的,却没动作,造成不可预知的错误。

关键变量,还是按位从PLC中直接读为好。

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc263273.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值