C#--通過Modbus TCP與西門子1200PLC通訊


以下是學習筆記:

學習參考: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,效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM