用wincc的腳本進(jìn)行二進(jìn)制位變量的位操作和判斷
鄭志武
發(fā)布于2013-11-08 11:42
5
0
標(biāo)簽:
建立一個16位的wincc二進(jìn)制位變量*,然后將S7的變量A,B,C。。。的值0/1按順序放到*中,放完后了再和固定值比對,每個位數(shù)值不對都對應(yīng)一個文字輸出。用腳本怎么編了?
問題補(bǔ)充:
思路是這樣的吧S7變量A,B,C等按順序排列放入WINCC變量中成一個01110111.。。。。的數(shù)或字符串,然后與固定值11111111比較,第四位和第八位不同則分別同時輸出兩個文本。不一個個比較是因為變量多了后太龐大了。
佳答案
在wincc中我習(xí)慣用字符串代替二進(jìn)制變量,因為不然的話可能涉及到wincc與PLC數(shù)據(jù)類型匹配的問題,而且,字符串函數(shù)可以幫助我們直觀快速地實現(xiàn)要求。
把PLC中的開關(guān)量(0/1)讀回來,在腳本中用cstr變成字符串。
針對你的問題,如果你plc中是一連串的點(diǎn),可以直接按字(八位)讀上來,再換成二進(jìn)制字符串。
如果你是在wincc中創(chuàng)建了一連串按規(guī)律命名的變量與plc變量相對應(yīng),比如在wincc中的變量A1-A10 對應(yīng)你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
'到此得到了你想要的二進(jìn)制的字符串形式,如果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
------------------------------------------------------------------------------------------------------------------------
以下是我程序中用到的一小段代碼,節(jié)選的,主要用于討論思路,dim什么的就省了。
For i = 3 To 14 Step 1
idec = Int(HMIRuntime.Tags ("I"&CStr(i)).Read) '讀八位開關(guān)量回來
ibinstr = ""
Do While idec > 0 '轉(zhuǎn)為二進(jìn)制字符串
ibinstr = CStr(idec Mod 2) & ibinstr
idec = idec 2
Loop
If Len (ibinstr) <> 8 Then '補(bǔ)全八位
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 '統(tǒng)計字符串中有多少個'"1"
End If
Next