三菱PLC RS232的模組是QJ71C24N-R2,當然還有其他的RS422/485(QJ71C24N-R4)
今天主要以RS232為主。
RS232 +-15V,RS422/485 0~5V
模組上的Neu.的燈號是指現在是MC Protocol的模式。
要與QJ71C24N通訊,有三種方式:
1.MC Protocol (Melsec Protocol)
2.Non Procedure Protocol(無通訊協定)
3.Bidirectional(雙向溝通)
1.MC Protocol:
通常是PC Base在寫的,透過Melsec定義的Format來連線存取三菱通訊模組的資料。
Format大概長的像下面那樣。
傳送的Format,接收的Format,異常時,Reply的Format。
至於怎麼知道Format是怎樣呢?
由下圖可知,C24可以使用3C或4C的Frame。
3C/4C的差異主要是4C支援多重CPU,如果沒用到的話,3C就可以了,可以減少資料量的傳遞。
4C的Format5可以支援用Binary Code在傳遞,不過個人還是認為用ASCII在PC Base上寫會比較直覺,不用在做值的運算。
詳細內容請參閱MC Protocol的User's Manual for RS232的部分。
2.Non Procedure Protocol(無通訊協定)
通常以結束碼或資料長度來設定資料傳遞結束
結束碼可由模組的Buffer Memery 165(CH1)/325(CH2)來設定(ODOAH是預設值,先收到ODH再收到OAH才對)
資料長度可由模組的Buffer Memery 164(CH1)/324(CH2)來設定(預設值是1FFH)
結束碼或資料長度條件成立時,Xn3(CH1)/XnA(CH2)會On來表示。
再使用專用指令G.INPUT/G.OUTPUT來存取Buffer的資料。
P.S: 資料透過C24傳到對方的Buffer Memery內,等待存取,對方收到不會回ACK。
3.Bidirectional(雙向溝通)
專用指令G.BIDIN/G.BIDOUT
對方收到會回個ACK,類似TCP的概念。
-----我是分格線-----------------------------------------------------------------------
C24 Module Parameters的設定:
Switch1~2(CH1)
Switch3~4(CH2)
Switch5(CH1 & CH2)
所以只有用CH1的話,Switch3~4空白沒關係。
依上圖,Switch1的Bit0~7參考下圖:
Bit05 On是For MC Protocal & Bidirectional Protocol在用的。
LINK功能,可以把此模組,當成一個中繼站~
當CH1 (RS232) 收到信號時,會自動由CH2 (RS422/485)發出。
當CH2 (RS422/485) 收到信號時,會自動由CH1 (RS232) 發出。
不需另外寫程式~
如下圖:
Switch1的Bit8~F參考下圖:
Switch2的參考下圖:
Switch5是不管使用CH1和CH2都要設定,對方要通訊的站號。
OH~1FH
Buffer Memery常用的位置:
150(CH1)/310(CH2):傳送時,以Word(0)或Byte(1)為單位,預設是Word(0)
151(CH1)/311(CH2):CD Check是否要關閉,預設是No Check(1)
162(CH1):傳送區的起始位置,預設是400H
163(CH1):傳送區的長度,預設是200H
322(CH2):傳送區的起始位置,預設是800H
323(CH2):傳送區的長度,預設是200H
164(CH1):接收區的多少長度時Xn3會On,預設1FFH
324(CH2):接收區的多少長度時XnA會On,預設1FFH
165(CH1):收到結束碼時,Xn3會On,預設是0D0AH
325(CH2):收到結束碼時,XnA會On,預設是0D0AH
166(CH1):接收區的起始位置,預設是600H
326(CH2):接收區的起始位置,預設是A00H
167(CH1):接收區的長度,預設是200H
327(CH2):接收區的長度,預設是200H
168(CH1):當有Non Produce發生Shift時,可用此功能將每次讀取完後的位置,下次重頭開始讀,這樣就不會Shift了。
1.當用接收數量來判斷接收完成時,每次都要清除BUFFER旗標,不然當雜訊進來,所以資料會偏移。
2.如果是利用結束碼來判斷時,則只要把允許接收數量設定為2倍以上的接收數量,就不會有問題了。(不需去清除BUFFER旗標)
專用指令G.Input/G.Output
G.OUTPUT指令格式:G.OUTPUT Un S1 S2 D1
(不可跟ZP.CSET & G.INPUT 同時執行) S1=設定Channel NUMBER S1+1=Error code(系統回傳)
S1+2=發送數量(WORD(預設)/BYTE) (發送數量的單位,可以在96H(CH1)/136H(CH2)中來選擇~)
S2 發送資料的起始暫存器,發送的資料需連續。
D1 發送完畢信號(BIT)
D1+1=發送有錯誤。
以BYTE為單位,16BIT(2BYTE)暫存器,可存2個ASCII碼,會送出2次~
低8位元先送出:
例:D120=3031H ASCII先送1(31H),再送0(30H)
發送數量的單位,可以在96H(CH1)/136H(CH2)中來選擇~
96H=0,CH1,以WORD來算發送數量。
136H=1,CH2,以BYTE來算發送數量。
相同情形下,要發送D120的值=3031H ASCII=10
以WORD來算,要設定1
以BYTE來算,要設定2
程式範例:
G.INPUT指令格式:G.INPUT Un S D1 D2
(不可跟ZP.CSET & G.INPUT 同時執行)
S=Channel number。接收通道
S+1=回傳錯誤碼(by system)。
接收結果
S+2=接收到的資料筆數(by system)。
接收數據計數。
S+3=允許接收的資料筆數。
接收數據的允許數目。
D1=接收資料存放區
D2=接收完成(成功/失敗)(bit)
D2+1=接收失敗
X03/X0A=模組有接收到正常資料。
(CH1/CH2) X04/X0B=模組有接收到異常資料。
如果資料沒有被取走,信號會一直ON。
可以利用這2個信號去觸發G.INPUT。
當G.INPUT讀取完成時X03/X0A,會馬上OFF。
這時候跟G.INPUT的完成信號(D2)有點時間差~
所以利用X03/X0A來呼叫副程式接受資料時,記得下降緣也再呼叫一次接收副程式。
否則因為X03/X0A OFF之後,D2會無法在副程式看到ON。
ZP.CSET指令格式:ZP.CSET “Un” S1 S2 D1 D2
S1=Channel number
S2=0
S2+1=0正常。不等於0就是錯誤碼(by system)
S2+2=4接收資料區buffer旗標清除。(Receive data clear request)
S2+3 ~ S2+111
FOR SYSTEM USE
D1 沒有使用
D2 清除指令完成
D2+1 清除動作中有異常~
D116=清除完成次數
D117=清除有異常
PS:不建議使用
如需使用清除接收buffer區旗標,可以直接去清除位址~
CH1=168(A8H),CH2=328(148H)