2024年4月18日发(作者:)
NC读写PLC数据
系统内部有一块NC/PLC高速交换数据的独立的区域(双端口RAM),该区域大小默认为
1024。这个数据交换区是在DRAM中,也就是说,系统下电后,交换区内数据不保持。
NC
R1=$ADBx[n]
NC/
PLC
数据
交换
区
FC21
写操作
PLC
$ADBx[n]=1.2
FC21
读操作
NC侧:
使用系统变量$A_DBB[n], $A_DBW[n], $A_DBD[n]和$A_DBR[n]读/写数据交换区的数据,不支
持位操作。
$A_DBB[n]
字节(8位)
$A_DBW[n]
字(16位)
$A_DBD[n]
双字(32位)
$A_DBR[n]
实数(32位)
使用$A_DBR[n]读写时,数据会有一定误差,因为NC中使用64位表示实数,而PLC中使用
32位表示实数。
如果只需要NC读取PLC的数据(例:R1=$A_DBR[0]),不需要设置机床数据。
如果还需要NC写数据到PLC(例:$A_DBR[4]=123.456),则需要根据实际情况设置:
MD28150 MM_NUM_VDIVAR_ELEMENTS
该数据所占内存=MD28150*24字节。
PLC侧:
使用PLC基本程序块FC21读/写数据交换区的数据。
FC21有多种功能,其中功能3是读操作,功能4是写操作。
参数 参数类型 参数数据类型 取值范围 说明
Enable Bool
输入 FC21有效
Funct Byte
输入 3,4 3—读;4—写
S7Var Any
输入 S7数据 源/目的
IVAR1 Int 0..1023
输入 偏移
IVAR2 Int -1..1023
输入 信号灯,-1是无
信号灯
Error Bool
输出
ErrCode Int
错误代码 输出
其中IVAR2(信号灯)用于NC与PLC的协调,告诉NC/PLC什么时候可以读数据,什么时候
可以写数据。如果数据量不大,不会产生NC/PLC读写冲突可以把IVAR2设为-1。(注:机床
的设计者应保证NC/PLC之间交换数据的时序。)
例1:
PLC编程加入:
CALL FC21
Enable:=TRUE
其中:”x”可以是B/W/D/R
“n”是数据交换区的偏移量,注意与PLC侧数据类型要一致。
Funct:=B#16#4 Å写操作
S7Var:=P#M100.0 BYTE 10 ÅMB100-MB109
IVAR1:=0 Å偏移为0
IVAR2:=99 Å信号灯字节为缓冲区第99个字节
Error:=M200.0
Errcode:=MW210
CALL FC21
Enable:=TRUE
Funct:=B#16#3 Å读操作
S7Var:=P#M150.0 BYTE 10 ÅMB150-MB159
IVAR1:=21 Å偏移为21
IVAR2:=98 Å信号灯字节为缓冲区第99个字节
Error:=M200.1
Errcode:=MW212
加工程序例:
$A_DBB[99]=0 Å信号灯=0 写操作
R50=0
AAA:
R[R50]=$A_DBB[R50]
MSG("R"< G4F0.3 R50=R50+1 IF R50<10 GOTOB AAA Å循环将MB100-MB109(通过中间缓冲区)的值读到R0-R9 STOPRE MSG("") $A_DBB[98]=1 $A_DBB[21]=R10 G4F0.5 M02 例2: PLC-侧 DUAL-PORT-RAM NC-侧 写信号灯 Byte 0 DPR_WRITE 读信号灯 DPR_READ Byte 1 Byte 2 Byte 3 MB100, MB101, MB102, MB103 R1 Byte 4 ⇐ MB 104,MB105, MB 106, MB107 R2 MB108, Mb109, MB110, MB111 R3 MB112,MB113, MB114,MB115 R4 MB116, MB117,MB118, MB119 R5 MB120, MB121, MB122, MB123 R6 ⇐ Byte 5 ⇐ Byte 6 ⇐ Byte 7 ⇐ Byte 8 ⇐ Byte 9 ⇐ Byte 10 ⇐ Byte 11 ⇐ Byte 12 ⇐ Byte 13 ⇐ Byte 14 ⇐ Byte 15 ⇒ Byte 16 ⇒ Byte 17 ⇒ Byte 18 ⇒ Byte 19 ⇒ Byte 20 ⇒ Byte 21 ⇒ Byte 22 ⇒ Byte 23 ⇒ Byte 24 ⇒ Byte 25 ⇒ Byte 26 ⇒ Byte 27 Byte 28 Byte 29 ....... ....... ENDE DPR BYTE 1023 NC向缓冲 区写数据 PLC从缓冲 区读数据 %_N_FC_21_WRITE_MPF ;$PATH=/_N_MPF_DIR N10 MSG("NC_WRITE") N20 if $A_DBB[0]<>0 GOTOF ENDE ; 信号灯不允许NC向缓冲区写数据(即PLC正在读 取数据还未完成),跳转到ENDE N30 $A_DBB[0]=0 ; Semaphore wird auf Null gesetzt N40 $A_DBR[4]=R1 ; 把R1的值写到缓冲区(byte4-7) STOPRE N50 $A_DBR[8]=R2 ; 把R2的值写到缓冲区(byte8-11) STOPRE N60 $A_DBR[12]=R3 ; 把R3的值写到缓冲区(byte12-15) N70 STOPRE N80 $A_DBB[0]=1 ; 把信号灯1改为允许PLC读数据 N90 ENDE: ; Sprungmarke N100 M30 CALL FC21 Enable: =TRUE ; FC21启动条件 Funct: =B#16#3 ; 3 = PLC读缓冲区的数据 S7Var: =P#M100.0 DWORD 3 ; 数据目的地,调用FC21后,PLC会把缓冲区中 Byte4开始的3个双字读出来并存放到 MD100(MB100,MB101,MB102,MB103) MD104(MB104,MB105,MB106,MB107) MD108(MB108,MB109,MB110,MB111) IVar1: =4 ; 偏移 4 Ivar2: =0 ; PLC读数据的信号灯 Error: =M79.4 ; 调用 FC21错误指示位 Errorcode: =MW77 ; 如出错,错误代码存放到MW77 NC从缓冲 区读数据 PLC向缓冲 区写数据 %_N_FC21_NCREAD_MPF ;$PATH=/_N_MPF_DIR N10 MSG("NC_READ") N20 if $A_DBB[1]==0 GOTOF ENDE ; 信号灯不允许NC读缓冲区数据(即PLC正在向 缓冲区写数据还未完成),跳转到ENDE N40R4= $A_DBR[16] ; 将缓冲区byte16-19的值读入到R4 STOPRE N50R5= $A_DBR[20] ; 将缓冲区byte20-23的值读入到R5 STOPRE N60 R6= $A_DBR[24] ; 将缓冲区byte24-27的值读入到R6 N70 STOPRE N80 $A_DBB[1]=0 ; 把信号灯改为0允许PLC写数据 N90 ENDE: N100 M30 CALL FC21 Enable: =TRUE ; FC21启动条件 Funct: =B#16#4 ; 4 = PLC向缓冲区写数据 S7Var: =P#M112.0 DWORD 3 ; 数据源,调用FC21后,会把 MD112(MB112,MB113,MB114,MB115) MD116(MB116,MB117,MB118,MB119) MD120(MB120,MB121,MB122,MB123) 这3个双字写到缓冲区Byte16-Byte27 IVar1: =16 ; 偏移 16 Ivar2: =1 ; PLC写数据的信号灯 Error: =M79.5 ; 调用 FC21错误指示位 Errorcode: =MW88 ; 如出错,错误代码存放到MW88
发布者:admin,转转请注明出处:http://www.yc00.com/news/1713413173a2244106.html
评论列表(0条)