三菱PLC連線的那些事 暫存器讀 寫

2021-10-04 04:18:23 字數 1293 閱讀 2535

前一篇講過,如何利用mx componet元件與三菱plc連線,下乙個問題就涉及到讀寫,你跑不掉的

有了官方元件,直接呼叫不就行了,對不對?對不對?

對!!!!

前提是不踩坑

首先,有這個方法getdevice(string szdevice, out int lpldata),第乙個是暫存器位址,傻瓜式呼叫,總之就是很方便有木有?有木有?

但是這個方法一次只能讀取乙個暫存器

沒事,問題不大,我還有readdeviceblock(string szdevice, int lsize, out int lpldata)

手冊裡面的描述是

軟元件的批量讀取-

從通過 szdevice(vardevice) 指定的軟元件開始,將 lsize(varsize) 容量的軟元件值作為 short 型的資料進 行批量讀取。 · 讀取的軟元件值將被儲存到 idata(lpsdata 或 lpvardata) 中。 · 對於 idata(lpsdata 或 lpvardata),應預留出 lsize(varsize) 容量以上的陣列

在 lsize(varsize) 中可指定的最大讀取點數為滿足下述條件的範圍。 讀取開始軟元件編號 + 讀取點數≤最終軟元件編號

指定位軟元件時,對軟元件編號可以以 16 的倍數進行指定。

對於 idata(lpsdata 或 lpvardata),應預留出相當於 lsize(varsize) 中指定點數的儲存器區域。 沒有儲存器區域的情況下,有可能會發生應用程式出錯等嚴重現象

手冊裡面有vb\vc\c++\vbs\vba的範例,偏偏沒有c#的,講道理我只看了個半懂,就只能自己嘗試

int  = -1;

int rescode = plcconnobj.readdeviceblock(「sd210」, 16, out readdata);

乍一看沒問題,仔細想想,不對勁

我是批量讀取,那麼輸出引數應該是乙個集合,不該是乙個int啊?

執行程式,結果也證明了,讀出來的只有乙個值,不科學?啊呸!科學?毛毛?!

總之一番糾結過後,做了個嘗試

int resdata = new int[16];

int rescode = plcconnobj.readdeviceblock(「sd210」, 16, out resdata[0]);

注意最後乙個引數

執行程式,數值都填充在陣列裡面了

沒錯,就醬

想想還真是有點坑,因為根據程式集裡面的封裝,第一反應是傳入乙個int型而非陣列,很難想到會用這樣的方式去傳遞

有些東西,不去嘗試,永遠不知道結果

就醬,掰掰

三菱PLC的TO指令

to指令是對fx2n 2da特殊功能模組進行設定的指令,可以理解為 to是由plc到功能模組的資料傳遞,from是從功能模組到plc的資料傳遞。to k0 k17 h2 k1 to 寫入指令 k0 模組首位址 k17 模組中對應的bfm區域號 h2 寫入值 k1 連續寫入的長度。連起來就是向模組首位...

三菱plc基本指令

三菱 fx 系列plc的基本邏輯指令 取指令與輸出指令 ld ldi ldp ldf out 1 ld 取指令 乙個常開觸點與左母線連線的指令,每乙個以常開觸點開始的邏輯行都用此指令。2 ldi 取反指令 乙個常閉觸點與左母線連線指令,每乙個以常閉觸點開始的邏輯行都用此指令。3 ldp 取上公升沿指...

三菱plc資料暫存器D的介紹

在輸入和輸出處理 模擬控制和位置控制期間,需要許多資料暫存器來儲存資料和引數。資料暫存器為16位,最高位為符號位。兩個資料暫存器可以組合儲存32位資料,最高位仍然是符號位。資料暫存器分為以下幾類 通用資料暫存器d0 d199有200個點。斷電 鎖存暫存器d200 d7999總共有7800個點。專用資...