一、 概述通過以太網(wǎng)為控制器擴(kuò)展功能模塊
AiMaker、AiMaster產(chǎn)品可以通過自身以太網(wǎng)網(wǎng)口來連接并控制遠(yuǎn)程IO模塊、遠(yuǎn)程模擬量輸出模塊、遠(yuǎn)程模擬量輸入模塊等各類兼容的模塊。
模塊擴(kuò)展功能通過100Mpbs以太網(wǎng)實(shí)現(xiàn),通訊速度比傳統(tǒng)PLC擴(kuò)展方式要快10至100倍。在可連接模塊數(shù)量上也遠(yuǎn)超傳統(tǒng)的PLC方案。通過以太網(wǎng)為控制器擴(kuò)展功能模塊
本方案采用標(biāo)準(zhǔn)的Modbus TCP協(xié)議作為擴(kuò)展協(xié)議,*使用以太網(wǎng)和TCP/IP方式進(jìn)行通訊,并且可以跨網(wǎng)段通訊。
在使用網(wǎng)線連接時(shí),主機(jī)與擴(kuò)展模塊之間的距離可以達(dá)到100米。在使用以太網(wǎng)光纖通訊時(shí),兩者穩(wěn)定通訊距離可達(dá)幾十公里。如果可以容忍較大的通訊延遲,也可以使用WiFi、手機(jī)網(wǎng)、電力貓等等各類線路進(jìn)行擴(kuò)展。
目前所有的擴(kuò)展模塊均為多網(wǎng)口設(shè)計(jì),多個(gè)擴(kuò)展模塊可以通過以太網(wǎng)手拉手分支、級(jí)聯(lián),實(shí)現(xiàn)自組以太網(wǎng),無需單獨(dú)購(gòu)買交換機(jī)。
每個(gè)控制器多可驅(qū)動(dòng)8個(gè)IO模塊、8個(gè)模擬量輸出模塊、8個(gè)模擬量采集模塊,對(duì)模塊的通道數(shù)量沒有限制。
兼容的遠(yuǎn)程IO模塊:GL-IO4(4路IO),GL-IO8(8路IO),GL-IO32(32路IO)
兼容的遠(yuǎn)程模擬量輸出模塊:GL-DAC3,3路模擬量輸出產(chǎn)品。此模塊有4個(gè)型號(hào),分別支持0至20mA輸出,0至10v輸出,0至5V輸出,PWM輸出。
兼容的遠(yuǎn)程模擬量采集模塊:GL-EXT600,同時(shí)支持8路模擬量采集和8路IO,此模塊有3個(gè)型號(hào),分別支持0至20mA采集,0至10v采集,0至5V采集。
本文的示例代碼均可在免費(fèi)編程軟件xframe中查看運(yùn)行。單擊下載xframe編程軟件
二、 示例連接圖
下圖演示了,為一臺(tái)AiMaker600擴(kuò)展1個(gè)3路模擬量輸出模塊、1個(gè)8路開關(guān)量輸入輸出模塊的連接方式。
將以此圖為例子,分別描述控制模擬量輸出、控制IO的方法。
三、 控制器模塊擴(kuò)展服務(wù)描述
1、 TCP/IP連接方式
控制器與擴(kuò)展模塊之間采用TCP/IP協(xié)議通訊,控制器作為Client連接至Server模式的擴(kuò)展模塊。擴(kuò)展通訊協(xié)議為Modbus TCP。使用502通訊端口。
2、 模塊擴(kuò)展函數(shù)庫(kù)
extdac:擴(kuò)展模擬量輸出函數(shù)庫(kù)
extdio:擴(kuò)展IO函數(shù)庫(kù)
extadc:擴(kuò)展模擬量采集函數(shù)庫(kù)
3、 啟動(dòng)擴(kuò)展模塊服務(wù)函數(shù)
啟動(dòng)擴(kuò)展模擬量輸出服務(wù):extdac.startextdac(0,"192.168.192.252",502,20,5000,15);
啟動(dòng)擴(kuò)展IO模塊服務(wù):extdio.startextdio(0,"192.168.192.252",502,20,5000,15);
啟動(dòng)擴(kuò)展模擬量采集模塊服務(wù):extadc.startextadc(0,"192.168.192.252",502,20,5000,15);
啟動(dòng)擴(kuò)展模塊服務(wù)函數(shù)在整個(gè)程序中,只需調(diào)用一次即可。
4、 使用方法
使用方法非常簡(jiǎn)單,以控制遠(yuǎn)程IO模塊繼電器輸出為例子進(jìn)行簡(jiǎn)要說明
下行代碼startextdio啟動(dòng)擴(kuò)展遠(yuǎn)程IO服務(wù)啟動(dòng),遠(yuǎn)程IO的IP為192.168.192.102,端口為502。
extdio.startextdio(0,"192.168.192.102",502,20,5000,15);
正確啟動(dòng)服務(wù)后,即可調(diào)用繼電器控制函數(shù),無需其他操作了。
seton設(shè)置遠(yuǎn)程IO模塊的第1路繼電器為接通
extdio.seton(0,0)
setoff設(shè)置遠(yuǎn)程IO模塊的第1路繼電器為斷開
extdio.setoff(0,0)
更詳細(xì)例子請(qǐng)參考下面的說明
5、 可靠性
控制器模塊擴(kuò)展服務(wù)可以自動(dòng)連接擴(kuò)展模塊,并且可以自動(dòng)檢測(cè)與擴(kuò)展模塊的通訊情況,如果檢測(cè)出與擴(kuò)展模塊通訊中斷,將會(huì)自動(dòng)的不斷嘗試重連,直到成功連接模塊。整個(gè)過程是全自動(dòng)的,無需用戶干預(yù)。
四、 控制遠(yuǎn)程模擬量輸出例子。
1、 控制4至20mA模擬量輸出
print("演示連接遠(yuǎn)程DAC模塊,并進(jìn)行控制,本例子測(cè)試的是0~20mA輸出。")
--startextdac啟動(dòng)擴(kuò)展遠(yuǎn)程模擬量輸出服務(wù)
--參數(shù)1:服務(wù)索引,有效值為0~7,可同時(shí)支持控制8個(gè)遠(yuǎn)程DAC輸出模塊。
--參數(shù)2:遠(yuǎn)程ip,為遠(yuǎn)程IO模塊的IP地址
--參數(shù)3:遠(yuǎn)程端口,為遠(yuǎn)程IO模塊的Modbus TCP協(xié)議端口。
--參數(shù)4:接收超時(shí),為秒值,達(dá)到此超時(shí)未能收到遠(yuǎn)程模塊返回?cái)?shù)據(jù),將判定此連接故障
--后臺(tái)服務(wù)將斷開此連接,并在等待“重試連接間隔”后,重新嘗試連接遠(yuǎn)程IO模塊。
--參數(shù)5:重試連接間隔,為毫秒值。
--參數(shù)6:保持連接的周期,為秒值,后臺(tái)服務(wù)將以此間隔不斷的向遠(yuǎn)程DAC模塊發(fā)送報(bào)文,以測(cè)試通訊線路是否正常。
--此參數(shù)為秒,應(yīng)小于遠(yuǎn)程DAC模塊的TCP/IP接收超時(shí)參數(shù)。
extdac.startextdac(0,"192.168.192.101",502,20,5000,15);
local setvalue=0.0
while(true) do
--setdac420ma設(shè)置擴(kuò)展模擬量輸出0至20mA值
--參數(shù)1:擴(kuò)展遠(yuǎn)程模擬量輸出服務(wù)索引,此索引應(yīng)由startextdac函數(shù)啟動(dòng)后方可使用。
--參數(shù)2:設(shè)置的模擬量輸出值,有效值為0至20。
--參數(shù)3:的模擬量輸出通道,為0起,0為個(gè)模擬量輸出通道。
--返回:成功返回大于0的值,否則為失敗
--循環(huán)設(shè)置遠(yuǎn)程DAC模塊的通道1輸出0~20mA電流,每次增加1mA。
res=extdac.setdac420ma(0,setvalue,0)
print(string.format("rnsetdac420ma 執(zhí)行結(jié)果%d", res));
setvalue=setvalue+1
if setvalue>20.0 then
setvalue=0
end
syslib.ossleep(2000);
end
end
2、 控制0至10V模擬量輸出
print("演示連接遠(yuǎn)程DAC模塊,并進(jìn)行控制,本例子測(cè)試的是0~10V輸出。")
--startextdac啟動(dòng)擴(kuò)展遠(yuǎn)程模擬量輸出服務(wù)
--參數(shù)1:服務(wù)索引,有效值為0~7,可同時(shí)支持控制8個(gè)遠(yuǎn)程DAC輸出模塊。
--參數(shù)2:遠(yuǎn)程ip,為遠(yuǎn)程IO模塊的IP地址
--參數(shù)3:遠(yuǎn)程端口,為遠(yuǎn)程IO模塊的Modbus TCP協(xié)議端口。
--參數(shù)4:接收超時(shí),為秒值,達(dá)到此超時(shí)未能收到遠(yuǎn)程模塊返回?cái)?shù)據(jù),將判定此連接故障
--后臺(tái)服務(wù)將斷開此連接,并在等待“重試連接間隔”后,重新嘗試連接遠(yuǎn)程IO模塊。
--參數(shù)5:重試連接間隔,為毫秒值。
--參數(shù)6:保持連接的周期,為秒值,后臺(tái)服務(wù)將以此間隔不斷的向遠(yuǎn)程DAC模塊發(fā)送報(bào)文,以測(cè)試通訊線路是否正常。
--此參數(shù)為秒,應(yīng)小于遠(yuǎn)程DAC模塊的TCP/IP接收超時(shí)參數(shù)。
extdac.startextdac(0,"192.168.192.101",502,20,5000,15);
local setvalue=0.0
while(true) do
--setdac010v設(shè)置擴(kuò)展模擬量輸出0至10V值
--參數(shù)1:擴(kuò)展遠(yuǎn)程模擬量輸出服務(wù)索引,此索引應(yīng)由startextdac函數(shù)啟動(dòng)后方可使用。
--參數(shù)2:設(shè)置的模擬量輸出值,有效值為0至10。
--參數(shù)3:的模擬量輸出通道,為0起,0為個(gè)模擬量輸出通道。
--返回:成功返回大于0的值,否則為失敗
--循環(huán)設(shè)置遠(yuǎn)程DAC模塊的通道1輸出0~10v電壓,每次增加1v。
res=extdac.setdac010v(0,setvalue,0)
print(string.format("rnsetdac010v 執(zhí)行結(jié)果%d", res));
setvalue=setvalue+1
if setvalue>10.0 then
setvalue=0
end
syslib.ossleep(2000);
end
3、 讀取模擬量輸出值
print("演示連接遠(yuǎn)程DAC模塊,設(shè)置0~20mA輸出值,并回讀輸出值。")
--startextdac啟動(dòng)擴(kuò)展遠(yuǎn)程模擬量輸出服務(wù)
--參數(shù)1:服務(wù)索引,有效值為0~7,可同時(shí)支持控制8個(gè)遠(yuǎn)程DAC輸出模塊。
--參數(shù)2:遠(yuǎn)程ip,為遠(yuǎn)程IO模塊的IP地址
--參數(shù)3:遠(yuǎn)程端口,為遠(yuǎn)程IO模塊的Modbus TCP協(xié)議端口。
--參數(shù)4:接收超時(shí),為秒值,達(dá)到此超時(shí)未能收到遠(yuǎn)程模塊返回?cái)?shù)據(jù),將判定此連接故障
--后臺(tái)服務(wù)將斷開此連接,并在等待“重試連接間隔”后,重新嘗試連接遠(yuǎn)程IO模塊。
--參數(shù)5:重試連接間隔,為毫秒值。
--參數(shù)6:保持連接的周期,為秒值,后臺(tái)服務(wù)將以此間隔不斷的向遠(yuǎn)程DAC模塊發(fā)送報(bào)文,以測(cè)試通訊線路是否正常。
--此參數(shù)為秒,應(yīng)小于遠(yuǎn)程DAC模塊的TCP/IP接收超時(shí)參數(shù)。
extdac.startextdac(0,"192.168.192.101",502,20,5000,15);
local setvalue=0.0
while(true) do
--setdac420ma設(shè)置擴(kuò)展模擬量輸出0至20mA值
res=extdac.setdac420ma(0,setvalue,0)
print(string.format("rnsetdac420ma 執(zhí)行結(jié)果%d", res));
setvalue=setvalue+1
if setvalue>20.0 then
setvalue=0
end
--readdac420ma讀取遠(yuǎn)程DAC模塊0~20mA輸出通道的當(dāng)前值
--參數(shù)1:擴(kuò)展遠(yuǎn)程模擬量輸出服務(wù)索引,此索引應(yīng)由startextdac函數(shù)啟動(dòng)后方可使用。
--參數(shù)2:讀取的0~20mA模擬量輸出的通道號(hào),為0起,0讀取路模擬量輸出通道。
--返回:返回1:成功返回大于0,否則失敗,返回2:當(dāng)前模擬量輸出的值,為浮點(diǎn)數(shù)。
res,dacoutvalue=extdac.readdac420ma(0,0)
if res>0 then
print(string.format("rnreaddac420ma 執(zhí)行結(jié)果:%d,通道值:%2.2f",res,dacoutvalue));
end
syslib.ossleep(2000);
end
四、 控制遠(yuǎn)程IO的例子。
1、控制遠(yuǎn)程IO的繼電器輸出
print("演示通過以太網(wǎng)控制遠(yuǎn)程IO模塊的1路開關(guān)量輸出")
--startextdio啟動(dòng)擴(kuò)展遠(yuǎn)程IO服務(wù)
--參數(shù)1:服務(wù)索引,有效值為0~7,可同時(shí)支持控制8個(gè)遠(yuǎn)程IO模塊。
--參數(shù)2:遠(yuǎn)程ip,為遠(yuǎn)程IO模塊的IP地址
--參數(shù)3:遠(yuǎn)程端口,為遠(yuǎn)程IO模塊的Modbus TCP協(xié)議端口。
--參數(shù)4:接收超時(shí),為秒值,達(dá)到此超時(shí)未能收到遠(yuǎn)程模塊返回?cái)?shù)據(jù),將判定此連接故障
--后臺(tái)服務(wù)將斷開此連接,并在等待“重試連接間隔”后,重新嘗試連接遠(yuǎn)程IO模塊。
--參數(shù)5:重試連接間隔,為毫秒值。
--參數(shù)6:保持連接的周期,為秒值,后臺(tái)服務(wù)將以此間隔不斷的向遠(yuǎn)程IO模塊發(fā)送報(bào)文,以測(cè)試通訊線路是否正常。
--此參數(shù)為秒,應(yīng)小于遠(yuǎn)程IO模塊的TCP/IP接收超時(shí)參數(shù)。
extdio.startextdio(0,"192.168.192.102",502,20,5000,15);
while(true) do
--seton設(shè)置遠(yuǎn)程IO通道為接通
--參數(shù)1:擴(kuò)展遠(yuǎn)程IO服務(wù)索引
--參數(shù)2:設(shè)置的通道,為0起,0為第1路輸出通道。
--返回:成功返回大于0的值,否則為失敗
res=extdio.seton(0,0)
print(string.format("rn設(shè)置擴(kuò)展IO通道1為接通的執(zhí)行結(jié)果%d", res));
syslib.ossleep(1000);
--setoff設(shè)置遠(yuǎn)程IO通道為斷開
--參數(shù)1:擴(kuò)展遠(yuǎn)程IO服務(wù)索引
--參數(shù)2:設(shè)置的通道,為0起,0為第1路輸出通道。
--返回:成功返回大于0的值,否則為失敗
res=extdio.setoff(0,0)
print(string.format("rn 設(shè)置遠(yuǎn)程IO通道1為斷開的執(zhí)行結(jié)果 %d", res));
syslib.ossleep(1000);
end
2、讀取遠(yuǎn)程IO開關(guān)量輸入狀態(tài)
print("演示通過以太網(wǎng)讀取遠(yuǎn)程IO模塊的1路開關(guān)量輸入狀態(tài)")
--startextdio啟動(dòng)擴(kuò)展遠(yuǎn)程IO服務(wù)
--參數(shù)1:服務(wù)索引,有效值為0~7,可同時(shí)支持控制8個(gè)遠(yuǎn)程IO模塊。
--參數(shù)2:遠(yuǎn)程ip,為遠(yuǎn)程IO模塊的IP地址
--參數(shù)3:遠(yuǎn)程端口,為遠(yuǎn)程IO模塊的Modbus TCP協(xié)議端口。
--參數(shù)4:接收超時(shí),為秒值,達(dá)到此超時(shí)未能收到遠(yuǎn)程模塊返回?cái)?shù)據(jù),將判定此連接故障
--后臺(tái)服務(wù)將斷開此連接,并在等待“重試連接間隔”后,重新嘗試連接遠(yuǎn)程IO模塊。
--參數(shù)5:重試連接間隔,為毫秒值。
--參數(shù)6:保持連接的周期,為秒值,后臺(tái)服務(wù)將以此間隔不斷的向遠(yuǎn)程IO模塊發(fā)送報(bào)文,以測(cè)試通訊線路是否正常。
--此參數(shù)為秒,應(yīng)小于遠(yuǎn)程IO模塊的TCP/IP接收超時(shí)參數(shù)。
extdio.startextdio(0,"192.168.192.102",502,20,5000,15);
while(true) do
--get1ich讀取遠(yuǎn)程IO模塊開關(guān)量輸入通道的狀態(tài)
--參數(shù)1:擴(kuò)展遠(yuǎn)程IO服務(wù)索引,此索引應(yīng)由startextdio函數(shù)啟動(dòng)后方可使用。
--參數(shù)2:讀取的開關(guān)量輸入通道,為0起,0為讀取第1路開關(guān)量輸入通道
--返回:參數(shù)1,成功返回大于0的值,否則為失敗,參數(shù)2為開關(guān)量輸入狀態(tài)值,0為斷開,1為接通
res,distate=extdio.get1in(0,0)
if (res>0) then
print(string.format("rn開關(guān)量輸入1狀態(tài):%d", distate));
end
syslib.ossleep(1000);
end
2、一次讀取全部遠(yuǎn)程IO開關(guān)量輸入狀態(tài)
print("演示通過以太網(wǎng)讀取遠(yuǎn)程IO模塊全部開關(guān)量輸入通道狀態(tài)")
local alldi={}
--startextdio啟動(dòng)擴(kuò)展遠(yuǎn)程IO服務(wù)
--參數(shù)1:服務(wù)索引,有效值為0~7,可同時(shí)支持控制8個(gè)遠(yuǎn)程IO模塊。
--參數(shù)2:遠(yuǎn)程ip,為遠(yuǎn)程IO模塊的IP地址
--參數(shù)3:遠(yuǎn)程端口,為遠(yuǎn)程IO模塊的Modbus TCP協(xié)議端口。
--參數(shù)4:接收超時(shí),為秒值,達(dá)到此超時(shí)未能收到遠(yuǎn)程模塊返回?cái)?shù)據(jù),將判定此連接故障
--后臺(tái)服務(wù)將斷開此連接,并在等待“重試連接間隔”后,重新嘗試連接遠(yuǎn)程IO模塊。
--參數(shù)5:重試連接間隔,為毫秒值。
--參數(shù)6:保持連接的周期,為秒值,后臺(tái)服務(wù)將以此間隔不斷的向遠(yuǎn)程IO模塊發(fā)送報(bào)文,以測(cè)試通訊線路是否正常。
--此參數(shù)為秒,應(yīng)小于遠(yuǎn)程IO模塊的TCP/IP接收超時(shí)參數(shù)。
extdio.startextdio(0,"192.168.192.102",502,20,5000,15);
while(true) do
alldi={}
--getallin讀取遠(yuǎn)程IO模塊全部輸入通道狀態(tài)
--參數(shù)1:擴(kuò)展遠(yuǎn)程IO服務(wù)索引,此索引應(yīng)由startextdio函數(shù)啟動(dòng)后方可使用。
--參數(shù)2:讀取的開關(guān)量輸入通道數(shù)量。例如設(shè)置為4,讀取全部4路輸入通道的狀態(tài)。
--參數(shù)3:開關(guān)量輸入狀態(tài)數(shù)據(jù)輸出數(shù)組,每個(gè)數(shù)組元素的8個(gè)bit表示8路開關(guān)量輸入狀態(tài)。
--bit狀態(tài)為0說明開關(guān)量輸入斷開,1為接通。
--例如,數(shù)組[1]的值表示第開關(guān)量輸入1~8輸入狀態(tài),數(shù)組[2]表示9~16開關(guān)量輸入狀態(tài)。
--返回:成功返回大于0的值,否則為失敗
res=extdio.getallin(0,4,alldi)
if (res>0) then
debug.printarray(alldi);
end
syslib.ossleep(1000);
end
五、 讀取遠(yuǎn)程模擬量采集模塊通道值
print("演示連接遠(yuǎn)程模擬量采集模塊,讀取0~20mA模擬量輸入值。")
--startextadc啟動(dòng)擴(kuò)展遠(yuǎn)程模擬量采集服務(wù)
--參數(shù)1:服務(wù)索引,有效值為0~7,可同時(shí)支持讀取8個(gè)遠(yuǎn)程模擬量采集模塊數(shù)據(jù)。
--參數(shù)2:遠(yuǎn)程ip,為遠(yuǎn)程IO模塊的IP地址
--參數(shù)3:遠(yuǎn)程端口,為遠(yuǎn)程IO模塊的Modbus TCP協(xié)議端口。
--參數(shù)4:接收超時(shí),為秒值,達(dá)到此超時(shí)未能收到遠(yuǎn)程模塊返回?cái)?shù)據(jù),將判定此連接故障
--后臺(tái)服務(wù)將斷開此連接,并在等待“重試連接間隔”后,重新嘗試連接遠(yuǎn)程IO模塊。
--參數(shù)5:重試連接間隔,為毫秒值。
--參數(shù)6:保持連接的周期,為秒值,后臺(tái)服務(wù)將以此間隔不斷的向遠(yuǎn)程模擬量采集模塊發(fā)送報(bào)文,以測(cè)試通訊線路是否正常。
--此參數(shù)為秒,應(yīng)小于遠(yuǎn)程模擬采集模塊的TCP/IP接收超時(shí)參數(shù)。
extadc.startextadc(0,"192.168.192.101",502,20,5000,15);
local extadcval=0.0
while(true) do
--readadc420ma讀取遠(yuǎn)程模塊0~20mA輸入通道值
--參數(shù)1:擴(kuò)展遠(yuǎn)程模擬量輸入服務(wù)索引,此索引應(yīng)由startextadc函數(shù)啟動(dòng)后方可使用。
--參數(shù)2:讀取的0~20mA模擬量輸入的通道號(hào),為0起,0讀取路模擬量輸入通道。
--返回:返回1:成功返回大于0,否則失敗,返回2:當(dāng)前模擬量輸入的值,為浮點(diǎn)數(shù),單位為mA。
res,extadcval=extadc.readadc420ma(0,0)
if res>0 then
print(string.format("rnreadadc420ma 執(zhí)行結(jié)果:%d,通道值:%2.2f",res,extadcval));
else
print(string.format("rnreadadc420ma 執(zhí)行失敗:%d",res));
end
syslib.ossleep(2000);
end