一般來說,讀M點位都是使用GetDevice這個方法,不過,當用for迴圈使用GetDevice或是短時間內使用GetDevice ( e.g. 在timer中使用,而且timer的inteval極短,200毫秒之類的 ) 時,介面程式會當掉,或是執行緒被咬死。
此時有個解法:使用讀D值的方法ReadDevice。
使用ReadDevice這個方法讀取完後,再一個bit一個bit逐一讀取。
不過要注意,一個long或int只能接一個D值,但一個long或integer有4個byte,而一個D卻只有2個byte,所以D值只會填在前面兩個byte(低位的部分),如下圖
不過使用這個方法有個限制,就是開頭的點位只能是16的倍數!
下面是個範例程式,其中函式B32是一個讀取變數第幾個bit的函式,其用法為 B32(variable As Long, indx As Long),代表讀取variable這個變數的第indx個bit。
Sub ReadDeviceTest()
Dim lRet As Long, lData() As Long, M4000Temp As Long, M4080Temp As Long
Dim M4000 As Long, M4001 As Long, M4015 As Long, M4080 As Long, M4082 As Long
Dim M4240 As Long, M4256 As Long
lRet = ActQNUDECPUTCP1.ReadDeviceBlock("M4000", 17, lData(0)) '讀M的資料 讀17個D解成272個16Bit
If lRet <> 0 Then
UDPCall.UDPEXPress ("ReadM4000DeviceBlock Error")
Else
M4000Temp = lData(0) ' 第1個D
M4000 = B32(M4000Temp, 0)
M4001 = B32(M4000Temp, 1)
M4015 = B32(M4000Temp, 15)
M4080Temp = lData(4) ' 第5個D
M4080 = B32(M4080Temp, 0)
M4082 = B32(M4080Temp, 2)
M4240 = B32(lData(15), 15)
M4256 = B32(lData(16), 0)
End If
End Sub
這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote |
沒有留言:
張貼留言