以下是學習筆記:
學習參考:https://www.bilibili.com/video/BV1LV41127M1?p=5&t=2752
一,回顧:上位機與PLC通信方式
1,S7,
2,ModbusTCP
3,TCP
4,UDP
5,OPC
二,Modbus協議基礎知識介紹存儲區:
1,輸入線圈 0區 --》I點
2,輸出線圈 1區--》Q點
3,輸入寄存器 3區--》PIW
4,輸出寄存器 4區--》DB存儲區 ,M區 0=40001 7=40008 起始地址都是從0開始的,
輸出寄存器的好處:可讀可寫,既可以表示布爾,又可以表示寄存器
所以輸出寄存器 4區 用的是最多的。
比如:
一個寄存器16個位
40001.0來表示布爾 讀取是方便的 但是寫入布爾比較麻煩,因為Modbus不支持寄存器布爾量的直接寫入
如果要寫入布爾量:要先讀取再偏移再寫入
如果是三菱PLC 比如D0.0 想寫入true或false也是比較麻煩的,因為三菱PLC也不支持寄存器布爾
寫入bool的方法:一個寄存器代表一個位,變true寫1,變flase寫0
三,硬件接線和PLC程序編寫
1,,硬件接線部分:
2,在博圖中寫好PLC程序
3,Modbus地址與PLC地址映射
3.1,布爾量的映射:
3.2 浮點型的映射
3.3,這里DB1是跟Modbus通訊的
例如:下面這個實例有19個寄存器
4,最后還要寫一個PLC作為ModbusTCP服務器的程序:
這里把DB1開始的38個字節映射PLC中了
5,
知識:
C#中:
float 單精度浮點 32bit,
double 雙精度浮點64bit,
decimal是高精度 128bit,浮點型。
float double 是 基本類型(primitive type),decimal不是。
float 有效數字7位,范圍 ±1.5 × 10E−45 to ±3.4 × 10E38
double 有效數字15/16 位,范圍 ±5.0 × 10 E−324 to ±1.7 × 10E308
decimal 有效數字 28/29 位,范圍 ±1.0 × 10E−28 to ±7.9 × 10E28
( E -- 下接幾次方)
decimal的有效位數很大,達到了28位,但是表示的數據范圍卻比float和double類型小。
使用的時候會對計算時的性能有影響。
常數寫法:
float f = 12.3F; (帶F)
double x=12.3; (不帶就是double)
decimal d = 12.30M; (帶M)
一個英文字母,無論大寫和小寫都是一個字符、一個字節,8位。
一個漢字是一個字符、兩個字節,16位
PLC中:
位(bit):是計算機 內部數據 儲存的最小單位,11001100是一個八位二進制數。
字節(byte):是計算機中 數據處理 的基本單位,習慣上用大寫 B 來表示,1B(byte,字節)= 8bit(位)
字符:是指計算機中使用的字母、數字、字和符號
B是字節(8位)
W是字(16位)
DW是雙字(32位)
V是變量存儲器
M是內部 存儲器
VB代表1個字節,即8位
VD代表4個字節,32位
VW代表2個字節,16位
MB代表內部存儲器1個字節,8位
一個浮點數4個字節32位,必須要占用兩個連續的寄存器
1個寄存器2個字節
比如:
讀40001浮點數,就是讀取40001和40002數據
讀40004浮點數,就是讀取40004和40005數據
(1)1個字節=8個位,用B(byte)表示
(2)1個字=16個位,用W(word)表示
(3)1個雙字=32個位,用D(double word)表示
(1)DB0.DBX0.0:表示一個位,不是0就是1
(2)DB0.DBB0:字節,里面只能是255以內的正數
(3)DB0.DBW0:字,里面可能是0-65535的正數,也可能是-32767到+32768之間的整數(有正負之分的數)
(4)DB0.DBD0:雙字,里面存放的類型比較多,分別是
(a)0-4294967295之間的正數
(b)-2147483648到2147483647的雙整數
(c)浮點數,即帶小數點的數
先用Modbus Poll來測試下:
1,連接
2,設置讀取19個寄存器,因為上面設置的PLC就是19個寄存器
3,這里就能看到PLC的數據了
4,監控PLC的實際值,跟Modbus Poll讀取的值不一樣。
5,修改Modbus Poll-->Display的數據類型就可以
6,現在就可以調試了,對PLC點位控制
四,C#程序
1,界面
2,手寫ModbusTCP通訊。也可以使用開源庫 NModbus4,這里我們使用開源庫
工具--》NuGet包管理器--》管理解決方案的NuGet程序包--》瀏覽--》搜索
備注:安裝好了之后,其實就是一個這樣一個dll文件,以后的項目如果沒有下載,可以直接用這個NModbus4.dll這文件
3,連接和斷開代碼編寫:
4,實時讀取PLC浮點型的數據 40008后面的12個寄存器是浮點型的數據
注意參數的地址,是相對地址還是絕對地址。
任意1個區都是從0開始的。0對應的是40001
正常的使用ushort[] res = master,ReadHoldingRegisters(4008,12),
如果是絕對地址就是7,相對地址就是4001+7=4008。
解析方法:把每兩個ushort類型轉換成一個float數據
解析思路:一共是6個數據12個ushort類型,把每兩個ushort類型轉換成一個float數據。
BitConverter.Tosingle:把字節數組轉換float數據。
注意:使用這個方法的時候注意大小端。
連接成功后開啟定時器
5,點動功能:
6,相對運動,絕對運動,會原點
7,更改速度,更改浮點型數據
/// <summary> /// float[]轉ushort /// </summary> /// <param name="val"></param> /// <returns></returns> private ushort[] GetUshortArrayFromFloat(float[] val) { ushort[] uintData = new ushort[val.Length*2]; Buffer.BlockCopy(val,0,uintData,0,uintData.Length*2); return uintData; }
8,讓小車動起來,其實就是修改控件的Location坐標,Y軸不變,X軸變化
9,效果: