電腦與plc通過網絡通信
根據 歐姆龍OMRONPLC之CP1H以太網FINS/TCP通訊實例,進行了實踐,將實踐過程及遇到的問題進行記錄。
所用材料:
- 歐姆龍CP1H-X40DT-D
- CP1W-CIF41模塊
- 網線
- 交換機
- 筆記本
- fins通訊手冊,這東西雖然是英文的,但是用來查查重點還是不錯的
- ethernet units和communication commands 這兩份手冊,這兩份手冊可能有用,網上找的,我自己沒有看
實驗步驟
詳細步驟不做贅述,參照上面那篇文章,記錄幾個比較重要的信息。
-
握手協議(命令碼為00000000)
格式:頭(FINS) + 長度(Hex0C) + 命令(00000000)+ 錯誤碼(00000000) + 客戶機節點地址
舉例:發送:46494E53 0000000C 00000000 00000000 00000002
返回:46494E53 00000010 00000001 00000000 00000002 00000001
這里的46494E53是FINS的ASCII碼,
0000000C是指這串代碼之后的字節長度,注意是用十六進制發送的,1個字節=8位(11111111=FF),所以每兩個十六進制數字字節長度加1,不要搞錯了
00000002是客戶端ip,我電腦設置的ip為192.168.250.2,實際上這里不一定要傳ip最后兩位進去,只要不是00000001,01是plc的地址
返回中的最后一串00000001就是plc的地址碼,錯誤碼全為0就表示沒有出錯,我也沒有遇到過出錯的情況,所以也不清楚會發生什么問題,真的遇到問題,可以參考最上面列的那篇博客。 -
讀指定地址的值(命令碼為00000002,fins中的命令為0101)
參考文章中以讀DM存儲區舉例,因為我實際用到的是CIO存儲區,所以我以CIO存儲區舉例
2.1 按照字(word)讀
查同一個作者的另一篇文章,歐姆龍OMRONPLC之HostLink通訊協議-FINS命令W字/位操作篇,CIO存儲區按照字的代碼為B0,讀取CIO區地址0000中的值,讀一個長度的字
發送:46494E53 0000001A 00000002 00000000 08000020 01000002 00FF0101 B0000000 0001
返回:46494E53 00000018 00000002 00000000 C0000200 02000001 00FF0101 000000C1
沒有找到對08000020的解釋
01000002的頭和尾分別為接收方和發送方
0101是命令
B0000000前兩位是CIO的地址碼,接下去的四位是字對應的地址,我讀的是0000,最后兩位是位的地址,因為是按字讀,所以這邊就是00不用管
0001表示讀一個字
返回碼中的最后8個十六進制數中,0000表示成功,00C1就是讀到的值
需要注意的是,一個字讀出來值占四個十六進制,因為一個字的位有0-15,最大就是11111111 11111111(FFFF),所以一個字占四個十六進制。2.2 按照位(bit)讀
CIO存儲區按位的代碼為30,讀取CIO區地址000104的值,讀一個位(地址000104就是輸入變量I01.04的地址)
發送:46494E53 0000001A 00000002 00000000 80000200 01000002 00FF0101 30000104 0001
接收:46494E53 00000017 00000002 00000000 C0000200 02000001 00FF0101 000001
這里接收到的和上面按字讀同樣是讀一個長度,但是字一個長度由四個十六進制組成,而位由兩個十六進制組成,注意區別,在寫入的時候也要注意讀的時候還遇到過一個問題,命名CIO0100地址中是有值的,但是讀出來全是0,那是因為犯了個錯誤,這里的CIO0100用的是十進制,發送的是十六進制,所以應該是0064地址,其實只是個小問題,仔細一點。
-
往指定區域寫入值(fins命令0102)
此處不特別舉例,參考那篇文章的例2-7,這里要注意的就是按位和按字的長度不要弄錯。
因為我自己遇到了一次出錯,錯誤碼為1003,查找了fins通訊手冊之后,發現是長度問題,錯誤碼在通訊手冊的5-1-3章節中。