關(guān)鍵字:S7-200 SMART;Modbus TCP;MATLAB。
系列文章目錄
基于S7-200 SMART實(shí)現(xiàn)一鍵啟停
順序功能圖——(二)設(shè)計(jì)機(jī)組延時(shí)關(guān)機(jī)程序
基于S7-200 SMART實(shí)現(xiàn)Modbus TCP通信
前言
提到PID控制,不知道各位第一個(gè)想到的相關(guān)實(shí)現(xiàn)軟件是什么,反正博主第一個(gè)想到的是MATLAB,不過這都是因?yàn)樵谶^去的學(xué)生時(shí)代接觸這個(gè)最多。相信基于PID的控制理念,不論是C++/C#還是Python基于這些高級(jí)語言很多軟件都能實(shí)現(xiàn)PID控制。不過在工作以后在過程控制或是運(yùn)動(dòng)控制PLC的使用十分廣泛,一些PLC也集成了PID控制的功能例如S7-200 SMART。
隨著時(shí)代的發(fā)展越來越多不同的PID控制也被運(yùn)用到工程中——模糊PID控制、專家PID控制、神經(jīng)網(wǎng)絡(luò)PID控制和差分進(jìn)化PID控制,他們是智能控制中專家控制、模糊控制、神經(jīng)網(wǎng)絡(luò)控制、優(yōu)化算法控制的發(fā)展的結(jié)果,雖然優(yōu)勢(shì)明顯,但僅憑PLC難以實(shí)現(xiàn),往往需要PC中的其他軟件進(jìn)行輔助。因此實(shí)現(xiàn)PC軟件如MATLAB與PLC之間的通信就是十分必要的。
一、Modbus TCP
Modbus TCP是一種通信協(xié)議,支持這種通信協(xié)議的設(shè)備只需要通過以太網(wǎng)就可以實(shí)現(xiàn)通數(shù)據(jù)傳輸,基于此通信協(xié)議,可以通過一根網(wǎng)線實(shí)現(xiàn)PC與PLC之間的數(shù)據(jù)處理,本文不會(huì)對(duì)Modbus TCP做重點(diǎn)介紹,需要學(xué)習(xí)的小伙伴可以走傳送門——帶你玩轉(zhuǎn)modbusTCP通信。
二、總體環(huán)境介紹
以下的案例基于:
- PC操作系統(tǒng):WIN11
- PLC:S7-200 SAMRT CPU ST60
- 通信介質(zhì):普通網(wǎng)線一根
- PLC編程軟件:STEP 7-Micro/WIN SMART V2.8
- MATLAB:R2019a
三、PLC中搭建服務(wù)端
在基于S7-200 SMART實(shí)現(xiàn)Modbu TCP通信一文中博主詳細(xì)介紹了基于S7-200 SMART搭建Modbus TCP服務(wù)端的搭建過程,這里只進(jìn)行簡(jiǎn)單介紹,需要重溫的小伙伴請(qǐng)走傳送門。
設(shè)置端口號(hào):502,保持寄存器包括從VB10000開始向后的1000個(gè)V寄存器。
四、Matlab中搭建客戶端
在Matlab中已經(jīng)集成好了Modbus通信需要的各種功能,這點(diǎn)十分方便,我們可以使用封裝好的函數(shù):
clc clear all; %創(chuàng)建modbus連接對(duì)象 mb = modbus('tcpip','192.168.2.1',502); %通信延時(shí)2s mb.Timeout = 2; for i=1:1:1000 %讀取數(shù)據(jù) data = read(mb,'holdingregs',1,10,'int16'); %寫入數(shù)據(jù) write(mb,'holdingregs',1,[data(1)+1 data(2)+1 data(3)+1 data(4)+1 data(5)+1 data(6)+1],'int16'); %表示暫停0.1s pause(1/10); end %斷開并清除modbus對(duì)象 clear mb
其中
mb = modbus('tcpip','192.168.2.1',502);
用于生成一個(gè)Modbus對(duì)象,比較像面向?qū)ο缶幊讨蓄惖膶?shí)例化。第一個(gè)參數(shù)表示是Modbus TCP通信,第二個(gè)參數(shù)表示服務(wù)端的IP地址(PLC的IP地址),第三個(gè)參數(shù)表示端口號(hào)。
mb.Timeout = 2;
用于設(shè)定Modbus對(duì)象的通信時(shí)間,超過此時(shí)間還未建立通信連接則認(rèn)為通信失敗。
data = read(mb,'holdingregs',1,10,'int16');
用于讀取數(shù)據(jù)并反回到一個(gè)變量里。第一個(gè)參數(shù)表示是通過mb對(duì)象讀取數(shù)據(jù),第二個(gè)參數(shù)表示讀取保持寄存器數(shù)據(jù),第三個(gè)參數(shù)表示從第一個(gè)地址開始讀取,第四個(gè)參數(shù)表示讀取10個(gè)數(shù)據(jù),第五個(gè)參數(shù)表示以int16類型的數(shù)據(jù)保存到data中。如果需要讀取的數(shù)據(jù)有多種類型也可以寫成如下形式:
data = read(mb,'holdingregs',1,[5,2,3],{ 'int16','uint32','double'});
write(mb,'holdingregs',1,[data(1)+1 data(2)+1 data(3)+1 data(4)+1 data(5)+1 data(6)+1],'int16');
用于寫入數(shù)據(jù)。第一個(gè)參數(shù)表示是通過mb對(duì)象寫入數(shù)據(jù),第二個(gè)參數(shù)表示寫入保持寄存器數(shù)據(jù),第三個(gè)參數(shù)表示從第一個(gè)地址開始寫入,第四個(gè)參數(shù)表示寫入的六個(gè)數(shù)據(jù),第五個(gè)參數(shù)表示以int16類型的數(shù)據(jù)保寫入。
clear mb
用于清除Modbus對(duì)象。
五、運(yùn)行結(jié)果
可以看到運(yùn)行結(jié)束后再PLC的V寄存器中VW10000~VW10010都比原來的值累加了1000,而且再M(fèi)ATLAB的工作區(qū)也得到了反應(yīng),值得一提的是,MATLAB的工作區(qū)不會(huì)實(shí)時(shí)更新數(shù)據(jù),只有在程序運(yùn)行完成后可以查看到運(yùn)行的結(jié)果。

總結(jié)
本文實(shí)現(xiàn)了S7-200 SMART與PC端Matlab的Modbus TCP通信,通過Matlab讀取與寫入了V區(qū)寄存器。