前兩天做了一個小的改造項目,需要使三菱q系列plc和一塊led顯示屏進行數(shù)據(jù)通訊,led顯示屏經(jīng)改造后支持rs232和rs485接口的modbus協(xié)議,plc側(cè)安裝有一塊型號為qj71c24n-r2的通訊模塊,查此模塊資料可知道此模塊提供兩個rs232物理接口ch1的ch2,可進行基于串口的無協(xié)議通訊,唯獨不能支持modbus協(xié)議??紤]到成本問題,不打算更換硬件,最后經(jīng)過查詢資料和驗證后,最終實現(xiàn)modbus協(xié)議通訊。以下是大概方法,供各位朋友交流參考,不對之處請指正。
首先要了解下什么是無協(xié)議通訊和modbus協(xié)議通訊。根據(jù)度娘所說:
所謂無協(xié)議通訊就是說通信網(wǎng)絡的兩個或多個終端通過通信網(wǎng)絡實現(xiàn)數(shù)據(jù)的傳輸,而不必遵循共同的規(guī)定或規(guī)則。
modbus 協(xié)議是應用于電子控制器上的一種語言。通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(例如以太網(wǎng))和其它設備之間可以通信。此協(xié)議定義了一個控制器能認識使用的消息結(jié)構,而不管它們是經(jīng)過何種網(wǎng)絡進行通信的。
說簡單點無協(xié)議通訊就相當于畫圖,想表達什么就畫什么,基本上全世界都能看懂。而modbus協(xié)議就是中文,只有中國人能看懂。要想讓一個不會中文的人和一個只懂中文的人交流,就只能讓這個不懂漢字的人模仿漢字的寫法,盡管他不認識這個字。所以咱要做的就是教會plc按照modbus協(xié)議的格式來和下位機對話,
接下來看下modbus協(xié)議的格式內(nèi)容,以modbus-rtu為例。
站地址:modbus網(wǎng)絡中設備都有一個屬于自己的站地址,用來區(qū)分是哪個設備來接收這個信息。
功能代碼:modbus設備所支持的功能代碼(需要查詢設備手冊),比如這次使用的modbus協(xié)議卡支持的功能碼如下:
01 讀線圈、
03 讀取保持寄存器、
04 讀輸入寄存器、
05 寫單個線圈、
06 寫單個寄存器、
15 寫多個線圈、
16 寫多個寄存器。
數(shù)據(jù)地址:modbus設備對應的寄存器地址,查設備手冊可知道。
crc校驗碼:crc16校驗碼占用1個字節(jié)。
plc側(cè)按照手冊上接好線,打開模塊設置,配置好ch2通道的參數(shù),如圖:
然后創(chuàng)建一個子程序,先把ch2 的錯誤處理程序?qū)懮?,防止通訊錯誤,影響其他設備通訊,然后向指定地址寫入數(shù)據(jù),確定ch2通訊數(shù)據(jù)長度單位。具體程序如圖所示:
上圖只是做演示,具體使用地址要看項目中模塊的配置數(shù)據(jù),具體查詢模塊手冊。
例如我要往畫面編號 1 輸入內(nèi)容 abcd在屏幕上顯示出來,
先配置設備modbus參數(shù),必須為rtu模式,從站地址24,字節(jié)順序為1234
字節(jié)順序具體看目標設備指定,
/*********************************************************/
18 從站地址 24
10 功能碼 16 寫多個寄存器地址
00 00 寄存器起始地址 0
00 02 寄存器個數(shù) 8 位(畫面編號1對應寄存器地址為0,占用8個寄存器共16字節(jié),超過16字節(jié)數(shù)據(jù)會被丟棄)
41 42 ab 的十六進制 acsii 碼
43 44 cd 的十六進制 acsii 碼
c1 53 crc16 校驗碼
要從plc發(fā)送內(nèi)容,先確定數(shù)據(jù)存儲區(qū),按照前面所示的數(shù)據(jù)結(jié)構,來定義數(shù)據(jù)存儲區(qū)數(shù)據(jù)。本例子中從d200開始,因為數(shù)據(jù)全部是按16進制傳送,要發(fā)送數(shù)據(jù)必須轉(zhuǎn)換為16進制后再寫入存儲區(qū),plc發(fā)送數(shù)據(jù)是按照先低八位后高八位的順序,所以在定義數(shù)據(jù)發(fā)送順序時必須遵守這個原則,如下面圖中程序所示:
這里重點要說一下crc校驗指令應用,
這里這個n是8位數(shù)據(jù)個數(shù),一個d地址是16位,一定要注意,
crc指令在三菱fx-2n以上系列中被支持,但在三菱q系列中,目前只有q03udv以上的cpu支持,往下的cpu只能通過梯形圖編寫crc校驗程序,這種例程在百度上能搜索到很多。
三菱q系列數(shù)據(jù)發(fā)送使用的是g.output指令。
寫入控制數(shù)據(jù)下圖為例程:
un的數(shù)值要根據(jù)模塊配置時起始xy地址確定清除錯誤狀態(tài)
程序編寫完成后,要使用串行模塊線路跟蹤工具進行發(fā)送數(shù)據(jù)測試,具體路徑在工具-智能功能模塊用工具-串行通信模塊-線路跟蹤
查看此區(qū)域發(fā)送的數(shù)據(jù)是不是想要發(fā)送的數(shù)據(jù),數(shù)據(jù)發(fā)送觸發(fā)完成之后點停止點開始跟蹤再選擇通道先選擇模塊
在實際應用中,可能需要對數(shù)據(jù)進行整理,以下是幾個常用數(shù)據(jù)處理指令
wtob指令:字節(jié)轉(zhuǎn)換為字,btow指令:字轉(zhuǎn)換為字節(jié)。swap指令:高低位互換。
具體參數(shù)編程手冊。