Modbus 協議傳輸的資料一般只有基本的 U16 型態,但在實際應用上可能因裝置不同而有不同的應用,例如長整數、浮點數,但又因為硬體 CPU/MCU/OS 實際狀況而有位元順序的問題,底下是 python 轉換函式…
def Convert( theType, values ):
if( theType == 'FLOAT(ABCD)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[0],tobytes[1],tobytes[2],tobytes[3])
set_value = struct.unpack('>f', packit)[0]
elif( theType == 'FLOAT(CDAB)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[2],tobytes[3],tobytes[0],tobytes[1])
set_value = struct.unpack('>f', packit)[0]
elif( theType == 'FLOAT(BADC)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[1],tobytes[0],tobytes[3],tobytes[2])
set_value = struct.unpack('>f', packit)[0]
elif( theType == 'FLOAT(DCBA)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[3],tobytes[2],tobytes[1],tobytes[0])
set_value = struct.unpack('>f', packit)[0]
elif( theType == 'UINT32(ABCD)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[0],tobytes[1],tobytes[2],tobytes[3])
set_value = struct.unpack('>L', packit)[0]
elif( theType == 'UINT32(CDAB)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[2],tobytes[3],tobytes[0],tobytes[1])
set_value = struct.unpack('>L', packit)[0]
elif( theType == 'UINT32(BADC)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[1],tobytes[0],tobytes[3],tobytes[2])
set_value = struct.unpack('>L', packit)[0]
elif( theType == 'UINT32(DCBA)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[3],tobytes[2],tobytes[1],tobytes[0])
set_value = struct.unpack('>L', packit)[0]
elif( theType == 'INT32(ABCD)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[0],tobytes[1],tobytes[2],tobytes[3])
set_value = struct.unpack('>l', packit)[0]
elif( theType == 'INT32(CDAB)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[2],tobytes[3],tobytes[0],tobytes[1])
set_value = struct.unpack('>l', packit)[0]
elif( theType == 'INT32(BADC)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[1],tobytes[0],tobytes[3],tobytes[2])
set_value = struct.unpack('>l', packit)[0]
elif( theType == 'INT32(DCBA)' ):
packit = struct.pack('>hh',values[0],values[1])
tobytes = struct.unpack('>4c', packit)
packit = struct.pack('>4c',tobytes[3],tobytes[2],tobytes[1],tobytes[0])
set_value = struct.unpack('>l', packit)[0]
elif( theType == 'UINT16(AB)' ):
packit = struct.pack('>h',values[0])
tobytes = struct.unpack('>2c', packit)
packit = struct.pack('>cc',tobytes[0],tobytes[1])
set_value = struct.unpack('>H', packit)[0]
elif( theType == 'UINT16(BA)' ):
packit = struct.pack('>h',values[0])
tobytes = struct.unpack('>2c', packit)
packit = struct.pack('>cc',tobytes[1],tobytes[0])
set_value = struct.unpack('>H', packit)[0]
elif( theType == 'INT16(AB)' ):
packit = struct.pack('>h',values[0])
tobytes = struct.unpack('>2c', packit)
packit = struct.pack('>cc',tobytes[0],tobytes[1])
set_value = struct.unpack('>h', packit)[0]
elif( theType == 'INT16(BA)' ):
packit = struct.pack('>h',values[0])
tobytes = struct.unpack('>2c', packit)
packit = struct.pack('>cc',tobytes[1],tobytes[0])
set_value = struct.unpack('>h', packit)[0]
else:
set_value = values[0]
return set_value
#Modbus 讀值可能是 2byte 也可能是 4byte
values = [-4370,-8756]
Convert( 'FLOAT(ABCD)' ,values )
Convert( 'FLOAT(DCBA)' ,values )
Convert( 'FLOAT(BADC)' ,values )
Convert( 'FLOAT(CDAB)' ,values )
Convert( 'UINT32(ABCD)' ,values )
Convert( 'UINT32(DCBA)' ,values )
Convert( 'UINT32(BADC)' ,values )
Convert( 'UINT32(CDAB)' ,values )
Convert( 'INT32(ABCD)' ,values )
Convert( 'INT32(DCBA)' ,values )
Convert( 'INT32(BADC)' ,values )
Convert( 'INT32(CDAB)' ,values )
Convert( 'UINT16(AB)' ,values )
Convert( 'INT16(AB)' ,values )
Convert( 'INT16(BA)' ,values )
Convert( 'UINT16(BA)' ,values )
2019年3月15日 星期五
訂閱:
張貼留言 (Atom)
VirtualBox 空間減肥
sdelete64 -z c: VBoxManage modifymedium disk "/Users/fellow/VirtualBox VMs/Win10/Win10.vdi" --compact *.vdi 路徑可以在 VirtualBox 儲...
-
https://github.com/ljean/modbus-tk/ install pip… sudo apt-get install python-pip install... download modbus_tk-x.x.x.tar.gz tar zxvf...
-
ARis... ARis 是日本一間公司出品的產品,應用了 ARToolKit 技術。 展示影片在這… http://www.youtube.com/watch?v=yCCx7zANsGE YouTube上可以找到更多類似的影片。 這邊是我用 FLARToolK...
-
由於ASSEMBLA即將開始收費,因此要把所有的SVN進行大搬家,連帶的一些教學文件也跟著搬家了,看來還是GOOGLE的窩最舒適(重點是免費) FPPA實驗平台教學教材-使用C語言 FPPA實驗平台簡介 實驗(一) 8位元LED輸出單元 與 模組設計總論 實驗(二) 按鍵開關輸入...
沒有留言:
張貼留言