免費(fèi)做自己的網(wǎng)站有錢賺嗎搜狗seo查詢
硬件設(shè)備
本實(shí)驗(yàn)中使用到的設(shè)備如下:
1、S7-200 Smart SR20 PLC
作為受控設(shè)備,執(zhí)行機(jī)構(gòu)。
S7-200 Smart是西門子的一款小型PLC產(chǎn)品(以下簡(jiǎn)稱Smart系列)。
Smart系列PLC是西門子公司經(jīng)過(guò)大量調(diào)研,為中國(guó)小型自動(dòng)化市場(chǎng)量身打造的一款PLC產(chǎn)品。與西門子S7-1200系列相比,Smart系列不支持博途開(kāi)發(fā)環(huán)境(使用STEP 7-MicroWIN SMART編程)、不支持Profinet通信(但支持Profibus);最多能擴(kuò)展6個(gè)信號(hào)模塊(EM)和1個(gè)信號(hào)板(SB)。
S7-200 SMART PLC 主要性能參數(shù) V2.3,如下圖
2、串口服務(wù)器 :USR-TCP232-410s
將PLC的485 串口信號(hào)轉(zhuǎn)成網(wǎng)絡(luò)信號(hào)接入局域網(wǎng)
產(chǎn)品參數(shù)如下:
3、單板機(jī)Orange Pi 3 LTS
運(yùn)行EPICS IOC,運(yùn)行上位控制程序。
4、串口線?
軟件部分
1、PLC上編程
初始化PLC為從設(shè)備,設(shè)置其工作模式為modbus rtu, 地址為3,波特率為115200,使用PLC自帶串口,無(wú)延時(shí),最大IO個(gè)數(shù)為256,最大模擬量為56個(gè)字,V存儲(chǔ)器是從VB2000開(kāi)始的100個(gè)字
一直使能這個(gè)從設(shè)備?
2、串口服務(wù)器部分
通過(guò)瀏覽器設(shè)置串口服務(wù)器的IP地址為自己所需的地址:
設(shè)置RS485端口的串口參數(shù),需要和PLC設(shè)置的參數(shù)保持一致,以及訪問(wèn)此RS485所需的端口號(hào):
3、單板機(jī)部分:
安裝操作系統(tǒng)和所需的EPICS模塊
1) 操作系統(tǒng)
Distributor ID: Ubuntu
Description: Ubuntu 22.04.2 LTS
Release: 22.04
Codename: jammy
2)所需安裝的EPICS 模板
由于EPICS模塊之間的依賴關(guān)系,需要以下4個(gè)模塊:
base, seq , ipac ,asyn, modbus
4、IOC建立過(guò)程
先創(chuàng)建一個(gè)項(xiàng)目目錄,在其下用makeBaseApp工具創(chuàng)建一個(gè)IOC應(yīng)用程序的框架,編輯configure/RELEASE文件,添加本IOC依賴的模塊,在程序src下Makefile中添加所依賴的庫(kù)文件和源文件; 在Db文件下添加模板文件:
configure/RELEASE:
...
SUPPORT=/usr/local/EPICS/synApps/support# If using the sequencer, point SNCSEQ at its top directory:
#SNCSEQ = $(MODULES)/seq-ver
ASYN=$(SUPPORT)/asyn
MODBUS=$(SUPPORT)/modbus
AUTOSAVE=$(SUPPORT)/autosave...
xxxApp/src:
....sr20smart_DBD += asyn.dbd
sr20smart_DBD += drvAsynIPPort.dbdsr20smart_DBD += modbus.dbd
sr20smart_DBD += asSupport.dbd# Include dbd files from all support applications:
# #sr20smart_DBD += xxx.dbd
#
# # Add all the support libraries needed by this IOC
#sr20smart_LIBS += xxx
sr20smart_LIBS += asyn
sr20smart_LIBS += modbus
sr20smart_LIBS += autosave...
xxxApp/Db:
bi_bit.template:用于按位讀取PLC的輸入輸出點(diǎn)。
record(bi,"$(P)$(R)$(D)$(M)_$(N)") {field(DTYP,"asynUInt32Digital")field(INP,"@asynMask($(PORT) $(OFFSET) 0x1)")field(SCAN,"$(SCAN)")field(ZNAM,"$(ZNAM)")field(ONAM,"$(ONAM)")field(ZSV,"$(ZSV)")field(OSV,"$(OSV)")
}
bo_bit.template:用于按位寫PLC的輸出點(diǎn)。
record(bo,"$(P)$(R)Q$(M)_$(N)") {field(DTYP,"asynUInt32Digital")field(OUT,"@asynMask($(PORT) $(OFFSET) 0x1)")field(ZNAM,"$(ZNAM)")field(ONAM,"$(ONAM)")
}
??longin_int16.template:用于按字讀取PLC的V存儲(chǔ)器以及模擬輸入映像區(qū),并且轉(zhuǎn)成16位整數(shù)。
record(longin,"$(P)$(R)$(T)_$(M)") {field(DTYP,"asynInt32")field(INP,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")field(SCAN, "$(SCAN)")
}
longoutInt16.template:?用于把16位整數(shù)按字寫入PLC的V存儲(chǔ)器。
record(longout,"$(P)$(R)$(T)_$(M)") {field(DTYP,"asynInt32")field(OUT,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")
}
?float32_in.template:用于按雙字讀取PLC的V存儲(chǔ)區(qū),并且轉(zhuǎn)成32位浮點(diǎn)數(shù)。
record(ai, "$(P)$(R)$(T)_$(M)") {field(DTYP,"asynFloat64")field(INP,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")field(HOPR,"$(HOPR)")field(LOPR,"$(LOPR)")field(PREC,"$(PREC)")field(SCAN,"$(SCAN)")
}
float32_out.template:用于將32位浮點(diǎn)數(shù)按雙字寫入到PLC的V存儲(chǔ)器。
record(ao, "$(P)$(R)$(T)_$(M)O") {field(DTYP,"asynFloat64")field(OUT,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")field(HOPR,"$(HOPR)")field(LOPR,"$(LOPR)")field(PREC,"$(PREC)")
}
回到此IOC的頂層目錄,編譯以上代碼,生產(chǎn)IOC程序。
5、編輯啟動(dòng)目錄,添加模板替換文件,編輯啟動(dòng)腳本st.cmd:
1)添加的實(shí)例化文件如下:
1)qb.substitutions:實(shí)例化8個(gè)bo記錄,用于寫,分別寫一個(gè)位到PLC的輸出點(diǎn)Q0.0~Q0.7
file "../../db/bo_bit.template" { pattern
{P, R, M, N, PORT, OFFSET, ZNAM, ONAM}
{SR20SMART:, BIT:, 0 0 QB0, 0, Low, High}
{SR20SMART:, BIT:, 0 1 QB0, 1, Low, High}
{SR20SMART:, BIT:, 0 2 QB0, 2, Low, High}
{SR20SMART:, BIT:, 0 3 QB0, 3, Low, High}
{SR20SMART:, BIT:, 0 4 QB0, 4, Low, High}
{SR20SMART:, BIT:, 0 5 QB0, 5, Low, High}
{SR20SMART:, BIT:, 0 6 QB0, 6, Low, High}
{SR20SMART:, BIT:, 0 7 QB0, 7, Low, High}
}
2)?qb_rbv.substitutions:實(shí)例化8個(gè)bi記錄,用于讀取,分別讀取一個(gè)位到PLC的輸出點(diǎn)Q0.0~Q0.7
file "../../db/bi_bit.template" { pattern
{P, R, D, M, N, PORT, OFFSET, ZNAM, ONAM, ZSV, OSV, SCAN}
{SR20SMART:, BIT:, Q, 0, 0_RBV, QB0_RBV, 0, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, Q, 0, 1_RBV, QB0_RBV, 1, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, Q, 0, 2_RBV, QB0_RBV, 2, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, Q, 0, 3_RBV, QB0_RBV, 3, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, Q, 0, 4_RBV, QB0_RBV, 4, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, Q, 0, 5_RBV, QB0_RBV, 5, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, Q, 0, 6_RBV, QB0_RBV, 6, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, Q, 0, 7_RBV, QB0_RBV, 7, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
}
3)ib.substitutions:實(shí)例化8個(gè)bi記錄,用于讀取,分別讀取一個(gè)位到PLC的輸出點(diǎn)I0.0~I0.7
file "../../db/bi_bit.template" { pattern
{P, R, D, M, N, PORT, OFFSET, ZNAM, ONAM, ZSV, OSV, SCAN}
{SR20SMART:, BIT:, I 0 0 IB0_1, 0, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, I 0 1 IB0_1, 1, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, I 0 2 IB0_1, 2, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, I 0 3 IB0_1, 3, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, I 0 4 IB0_1, 4, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, I 0 5 IB0_1, 5, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, I 0 6 IB0_1, 6, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
{SR20SMART:, BIT:, I 0 7 IB0_1, 7, Low, High, NO_ALARM, MAJOR, "I/O Intr"}
}
4)?int.substitutions:實(shí)例化2個(gè)longin記錄,第一個(gè)實(shí)例將從PLC模擬輸入?yún)^(qū)或V存儲(chǔ)區(qū)讀取的一個(gè)字轉(zhuǎn)換成16位有符號(hào)數(shù),第二個(gè)實(shí)例將從PLC模擬輸入?yún)^(qū)或V存儲(chǔ)區(qū)讀取的一個(gè)字轉(zhuǎn)換成16位無(wú)符號(hào)數(shù)。
file "../../db/longin_int16.template" { pattern
{P, R, T, M PORT, OFFSET, DATA_TYPE , SCAN}
{SR20SMART:, INT, 16, I0, VW, 0 , INT16 , "I/O Intr"}
{SR20SMART:, UINT, 16, UI0, VW, 1 , UINT16 , "I/O Intr"}
}
5)into.substitutions:實(shí)例化2個(gè)longout記錄,第一個(gè)實(shí)例將16位有符號(hào)數(shù)按字寫入到PLC的V存儲(chǔ)區(qū),第一個(gè)實(shí)例將16位無(wú)符號(hào)數(shù)按字寫入到PLC的V存儲(chǔ)區(qū)。
file "../../db/longoutInt16.template" { pattern
{P, R, T, M, PORT, OFFSET, DATA_TYPE}
{SR20SMART:, INT 16, IO, VWO, 0, INT16}
{SR20SMART:, UINT 16, UIO, VWO, 1, UINT16}
}
6)?float.substitutions:實(shí)例化2個(gè)ai記錄,這兩個(gè)實(shí)例將分別從PLC模擬輸入?yún)^(qū)或V存儲(chǔ)區(qū)讀取的二個(gè)字轉(zhuǎn)換成32位浮點(diǎn)數(shù)。
file "../../db/float32_in.template" { pattern
{P, R, T, M, PORT, OFFSET, DATA_TYPE , HOPR, LOPR, , PREC ,SCAN}
{SR20SMART:, FLOAT, 32: F00 VW, 2 ,FLOAT32_BE , 1000, -1000, ,3 , "I/O Intr"}
{SR20SMART:, FLOAT, 32: F01 VW, 4 ,FLOAT32_BE , 1000, -1000, ,3 , "I/O Intr"}
}
7)實(shí)例化2個(gè)ao記錄,這兩個(gè)實(shí)例將分別將32位浮點(diǎn)數(shù)按雙字寫入到PLC的V存儲(chǔ)區(qū)
file "../../db/float32_out.template" { pattern
{P, R, T, M, PORT, OFFSET, DATA_TYPE , HOPR, LOPR, , PREC}
{SR20SMART:, FLOAT, 32: F00 VWO, 2 ,FLOAT32_BE , 1000, -1000, ,3 }
{SR20SMART:, FLOAT, 32: F01 VWO, 4 ,FLOAT32_BE , 1000, -1000, ,3 }
}
2) 編輯st.cmd文件:
#!../../bin/linux-x86_64/sr20smart#- You may have to change sr20smart to something else
#- everywhere it appears in this file< envPathscd "${TOP}"## Register all support components
dbLoadDatabase "dbd/sr20smart.dbd"
sr20smart_registerRecordDeviceDriver pdbbasedrvAsynIPPortConfigure("sr20smart","192.168.3.209:6666",0,0,1)
modbusInterposeConfig("sr20smart",1 ,2000,0)# func code = 5 按位寫線圈
drvModbusAsynConfigure("QB0", "sr20smart", 3, 5, 0, 8 , 0, 100, "QB0")
# func code = 1 按位讀線圈
drvModbusAsynConfigure("QB0_RBV", "sr20smart", 3, 1, 0, 8 , 0, 200, "QB0_RBV")# func code = 2 按位讀取離散輸入
drvModbusAsynConfigure("IB0_1", "sr20smart", 3, 2, 0, 8 , 0, 200, "IB0_1")# func code = 3 按字讀取保持寄存器
drvModbusAsynConfigure("VW", "sr20smart", 3, 3, 0, 20 , 0, 200, "VW")# func code = 4 按字讀取輸入寄存器
drvModbusAsynConfigure("AWI", "sr20smart", 3, 4, 0, 10 , 0, 200, "AWI")# func code = 6 按字寫入保持寄存器
drvModbusAsynConfigure("VWO", "sr20smart", 3, 6, 0, 20 , 0, 200, "VWO")cd "${TOP}/iocBoot/${IOC}"
dbLoadTemplate("qb.substitutions")
dbLoadTemplate("qb_rbv.substitutions")
dbLoadTemplate("ib.substitutions")dbLoadTemplate("int.substitutions")
dbLoadTemplate("float.substitutions")
dbLoadTemplate("floato.substitutions")
dbLoadTemplate("into.substitutions")iocInit
IOC程序啟動(dòng)以及測(cè)試
在IOC啟動(dòng)目錄下,程序啟動(dòng)命令:../../bin/linux-aarch64/sr20smart st.cmd
dbl查看所有加載的記錄。
root@orangepi3-lts:/usr/local/EPICS/program/sr20smart/iocBoot/iocsr20smart# ../../bin/linux-aarch64/sr20smart st.cmd
#!../../bin/linux-x86_64/sr20smart
...
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.7
## Rev. 2023-06-25T15:50+0000
## Rev. Date build date/time:
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncxxx,"user=blctrl"
epics> dbl
SR20SMART:FLOAT32:_F00
SR20SMART:FLOAT32:_F01
SR20SMART:FLOAT32:_F00O
SR20SMART:FLOAT32:_F01O
SR20SMART:BIT:Q0_0_RBV
SR20SMART:BIT:Q0_1_RBV
SR20SMART:BIT:Q0_2_RBV
SR20SMART:BIT:Q0_3_RBV
SR20SMART:BIT:Q0_4_RBV
SR20SMART:BIT:Q0_5_RBV
SR20SMART:BIT:Q0_6_RBV
SR20SMART:BIT:Q0_7_RBV
SR20SMART:BIT:I0_0
SR20SMART:BIT:I0_1
SR20SMART:BIT:I0_2
SR20SMART:BIT:I0_3
SR20SMART:BIT:I0_4
SR20SMART:BIT:I0_5
SR20SMART:BIT:I0_6
SR20SMART:BIT:I0_7
SR20SMART:BIT:Q0_0
SR20SMART:BIT:Q0_1
SR20SMART:BIT:Q0_2
SR20SMART:BIT:Q0_3
SR20SMART:BIT:Q0_4
SR20SMART:BIT:Q0_5
SR20SMART:BIT:Q0_6
SR20SMART:BIT:Q0_7
SR20SMART:INT16_I0
SR20SMART:UINT16_UI0
SR20SMART:AINT16_I0
SR20SMART:AUINT16_UI0
SR20SMART:INT16_IO
SR20SMART:UINT16_UIO
1)bo記錄SR20SMART:BIT:Q0_0 ~?SR20SMART:BIT:Q0_7:用于設(shè)置PLC Q0.0~Q0.7。
2)bi記錄SR20SMART:BIT:Q0_0_RBV ~ SR20SMART:BIT:Q0_7_RBV:用于讀取PLC Q0.0~Q0.7的狀態(tài)。
3)bi記錄SR20SMART:BIT:I0_1~SR20SMART:BIT:I0_7:用于讀取PLC I0.0~I0.7的狀態(tài)。
4) longin記錄SR20SMART:INT16_I0和SR20SMART:UINT16_UI0:用于讀取V存儲(chǔ)區(qū)VW2000,VW2002。
5)longin記錄SR20SMART:AINT16_I0和SR20SMART:AUINT16_UI0:用于讀取模擬量輸入寄存器AIW0和AIW2。
6)bo記錄SR20SMART:INT16_IO和SR20SMART:UINT16_UIO:用于寫入V存儲(chǔ)區(qū)VW2000,VW2002。
7)ai記錄SR20SMART:FLOAT32:_F00和SR20SMART:FLOAT32:_F01用于讀取V存儲(chǔ)區(qū)VD2004和VD2008。
8) ao記錄SR20SMART:FLOAT32:_F00O和SR20SMART:FLOAT32:_F01O:寫入V存儲(chǔ)區(qū)VD2004和VD2008。
測(cè)試
用STEP7 Micro/Win SMART狀態(tài)表設(shè)置V存儲(chǔ)區(qū)如下:
用通道訪問(wèn)進(jìn)行讀取:
# VW2000
orangepi@orangepi5:~$ caget SR20SMART:INT16_I0
SR20SMART:INT16_I0 -12345
# VW2002
orangepi@orangepi5:~$ caget SR20SMART:UINT16_UI0
# VD2004
SR20SMART:UINT16_UI0 22222
orangepi@orangepi5:~$ caget SR20SMART:FLOAT32:_F00
SR20SMART:FLOAT32:_F00 3.1415
# VD2008
orangepi@orangepi5:~$ caget SR20SMART:FLOAT32:_F01
SR20SMART:FLOAT32:_F01 0.1111
# AIW0
orangepi@orangepi5:~$ caget SR20SMART:AINT16_I0
SR20SMART:AINT16_I0 -2000
# AIW2
orangepi@orangepi5:~$ caget SR20SMART:AUINT16_UI0
SR20SMART:AUINT16_UI0 2000
用通道訪問(wèn)寫更改Q和V存儲(chǔ)區(qū):
# Q0.0
orangepi@orangepi5:~$ caput SR20SMART:BIT:Q0_1 0
Old : SR20SMART:BIT:Q0_1 High
New : SR20SMART:BIT:Q0_1 Low
# Q0.1
orangepi@orangepi5:~$ caput SR20SMART:BIT:Q0_0 0
Old : SR20SMART:BIT:Q0_0 High
New : SR20SMART:BIT:Q0_0 Low
# VW2000
orangepi@orangepi5:~$ caput SR20SMART:INT16_IO -6666
Old : SR20SMART:INT16_IO 0
New : SR20SMART:INT16_IO -6666
# VW2002
orangepi@orangepi5:~$ caput SR20SMART:UINT16_UIO 8888
Old : SR20SMART:UINT16_UIO 0
New : SR20SMART:UINT16_UIO 8888
# VD2004
orangepi@orangepi5:~$ caput SR20SMART:FLOAT32:_F00O 1.2345
Old : SR20SMART:FLOAT32:_F00O 0
New : SR20SMART:FLOAT32:_F00O 1.2345
# VW2008
orangepi@orangepi5:~$ caput SR20SMART:FLOAT32:_F01O 5.4321
Old : SR20SMART:FLOAT32:_F01O 0
New : SR20SMART:FLOAT32:_F01O 5.4321
從STEP7 Micro/Win SMART狀態(tài)表查看相應(yīng)的存儲(chǔ)區(qū):