前請提要:
從PLC讀取的數值,不管是讀正負整數還是正負浮點數,讀取過來后都會變成UInt16,也就是Ushort類型
一、ushort(UInt16)轉成 Int32
源代碼方法:
//ushort類型轉Int32類型的方法private int ushortToInt32(ushort[] date, int start){//先進行判斷,長度是否正確if (start < 0 || start + 1 >= dat.Length){throw new Exception($"ushortToInt32索引超范圍{start}");}//這里是將數組拆分成4段,然后重新編成一個數組byte[] tmp = new byte[4];byte[] byteH = BitConverter.GetBytes(dat[start + 1]);byte[] byteL = BitConverter.GetBytes(dat[start + 0]);tmp[0] = byteL[0];tmp[1] = byteL[1];tmp[2] = byteH[0];tmp[3] = byteH[1];//這是里byte轉成Int32return BitConverter.ToInt32(tmp, 0);}
前請提要:Int32是32位,ushort是16位,byte是8位
(1)使用原因
向PLC的地址讀取數據,PLC向地址寫入32位整數,數值為100,但Modbus傳輸走的是16位,因此無法直接把數值展示到頁面上,所以需要轉成32為整數
(2)為何是 ushort 轉 Int32
用ReadHoldingRegisters方法接收的值為ushort類型
(3)轉換方法的思路
先將ushort類型轉成byte類型,再將byte類型轉成Int32類型
(4)輸入參數
前者是所要轉換的ushort類型數組,后者是ushort類型數組從第幾個數組開始轉化(需要注意的是,一次只能轉化一個;無法說調用一次方法,將ushort數組轉成好幾個Int32類型值)
(5)檢查所要轉換的數組長度
何為所要轉換的數組長度,比如ushort數組里只有兩個,因此我們只能轉 ushort[0] 和 ushort[1],但是int start 寫成 1 ,那就是轉化 ushort[1] 和 ushort[2] ,而 ushort[2] 根本不存在,因此拋出異常;同理當 ushort 的數組只有一位,根本不滿足轉化條件,因此也會拋出異常
(6)ushort 數組拆分成 byte 成啥樣
Int32 | 100 | |||
ushort | ushort[0] = 100 | ushort[1] = 0 | ||
byte | byte[0] = 100 |