[Codesys]常用功能块应用分享-BMOV功能块功能介绍及其使用实例说明

官方说明

功能说明

|------------|-----------------|-------------|
| 参数 | 类型 | 功能 |
| pbyDataSrc | POINTER TO BYTE | 指向源数组指针 |
| uiSize | UINT | 要移动数据的BYTE数 |
| pbyDataDes | POINTER TO BYTE | 指向目标数组指针 |
| | | |

实例应用-ST

Crystal 复制代码
IF SYSTEM_CLOCK.AlwaysTrue THEN
		CASE iAutoState OF
		0:  //读写完成信号在下次读写信号的上升沿或复位信号的下降沿清除
			ClearRtrig(CLK:=(ReadCmd OR WriteCmd)AND OPMODE.User_Interface_OUT.Reset=FALSE,Q=>TrigClearQ);
			IF TrigClearQ THEN
				RW_Done:=FALSE;
				RFID_ReadCmd_Mid:=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
				iStartAddrChangebale:=0;
				RfidBaseReset:=TRUE;
			END_IF
			
			IF RW_Done=FALSE AND iRfidBaseState=10 AND iStartAddrChangebale=0 THEN
				RfidBaseReset:=FALSE;
				iAutoState:=5;
			END_IF	
		5:
			IF ReadCmd=TRUE AND WriteCmd=FALSE AND TagPresent=TRUE AND RWHeadNotConnected=FALSE AND RfidErr=FALSE  THEN
				RFID_ReadCmd_Mid:=TRUE;
				RFID_WriteCmd_Mid:=FALSE;
				iAutoState:=10;
			ELSIF ReadCmd=FALSE AND WriteCmd=TRUE  AND TagPresent=TRUE AND RWHeadNotConnected=FALSE AND RfidErr=FALSE THEN
				iAutoState:=100;
			ELSIF (ReadCmd=TRUE OR WriteCmd=TRUE)  AND TagPresent=FALSE THEN
				RFID_ReadCmd_Mid:=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
				TagNotExitAlarm:=TRUE;
				iAutoState:=200;
			ELSIF  (ReadCmd=TRUE OR WriteCmd=TRUE)  AND RWHeadNotConnected=TRUE THEN
				RFID_ReadCmd_Mid:=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
				RfidNotHeaderAlarm:=TRUE;
				iAutoState:=200;
			END_IF
		10://RFID DATA READ CONTROL
			IF Done=TRUE AND RfidErr=FALSE THEN
				iStartAddrChangebale:=iStartAddr;
				BMOV(pbyDataSrc:=pRdSrcMid , uiSize:=128 , pbyDataDes:=pRdOne);
			ELSIF RfidErr THEN
				GeneralAlarm:=TRUE;
			END_IF
			
			IF Done=TRUE AND GeneralAlarm =FALSE THEN
				iAutoState:=20;
			ELSIF GeneralAlarm=TRUE THEN 
				iAutoState:=200;
			END_IF
		20:
			IF GeneralAlarm=FALSE AND RFID_ReadCmd_Mid=TRUE AND RFID_WriteCmd_Mid=FALSE THEN
				RFID_ReadCmd_Mid :=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
			ELSIF GeneralAlarm=FALSE AND  RFID_ReadCmd_Mid=FALSE AND RFID_WriteCmd_Mid=FALSE THEN 
				iAutoState:=30;
			END_IF
		30:
			IF AutoRdCmd=TRUE AND AutoWrCmd=FALSE AND TagPresent=TRUE AND RfidErr=FALSE  THEN
				RFID_ReadCmd_Mid:=TRUE;
				RFID_WriteCmd_Mid:=FALSE;
				iAutoState:=40;
			END_IF
		40:
			IF Done=TRUE AND RfidErr=FALSE THEN
				iStartAddrChangebale:=iStartAddr+128;
				BMOV(pbyDataSrc:=pRdSrcMid , uiSize:=128 , pbyDataDes:=pRdTwo);
			ELSIF RfidErr THEN
				GeneralAlarm:=TRUE;
			END_IF
			
			IF Done=TRUE AND GeneralAlarm =FALSE THEN
				iAutoState:=50;
			ELSIF GeneralAlarm=TRUE THEN 
				iAutoState:=200;
			END_IF
		50:
			IF GeneralAlarm=FALSE AND RFID_ReadCmd_Mid=TRUE AND RFID_WriteCmd_Mid=FALSE THEN
				RFID_ReadCmd_Mid :=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
			ELSIF GeneralAlarm=FALSE AND  RFID_ReadCmd_Mid=FALSE AND RFID_WriteCmd_Mid=FALSE THEN 
				iAutoState:=60;
			END_IF
		60:
			IF AutoRdCmd=TRUE AND AutoWrCmd=FALSE AND TagPresent=TRUE AND RfidErr=FALSE  THEN
				RFID_ReadCmd_Mid:=TRUE;
				RFID_WriteCmd_Mid:=FALSE;
				iAutoState:=70;
			END_IF		
		70:
			IF Done=TRUE AND RfidErr=FALSE THEN
				iStartAddrChangebale:=iStartAddr+256;
				BMOV(pbyDataSrc:=pRdSrcMid , uiSize:=128 , pbyDataDes:=pRdThree);
			ELSIF RfidErr THEN
				GeneralAlarm:=TRUE;
			END_IF
			
			IF Done=TRUE AND GeneralAlarm =FALSE THEN
				iAutoState:=80;
			ELSIF GeneralAlarm=TRUE THEN 
				iAutoState:=200;
			END_IF
		80://RFID DATA READ FINISHE RETURN
			IF GeneralAlarm=FALSE THEN
				RW_Done:=TRUE;
				RFID_ReadCmd_Mid :=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
				iStartAddrChangebale:=0;
				iAutoState:=0;
			END_IF
			
	   100://RFID DATA WRITE CONTROL
	   		IF AutoRdCmd=FALSE AND AutoWrCmd=TRUE THEN
				iStartAddrChangebale:=iStartAddr;
	   			BMOV(pbyDataSrc:=pWrOne , uiSize:=128 , pbyDataDes:=pWrSrcMid);
				RFID_ReadCmd_Mid :=FALSE;
				RFID_WriteCmd_Mid:=TRUE;
				iAutoState:=105;
	   		END_IF
	   105:
	   	    IF Done=TRUE AND RfidErr=FALSE THEN
				GeneralAlarm:=FALSE;
			ELSIF RfidErr THEN
				GeneralAlarm:=TRUE;
			END_IF
			
			IF Done=TRUE AND GeneralAlarm =FALSE THEN
				RFID_ReadCmd_Mid :=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
				iAutoState:=110;
			ELSIF GeneralAlarm=TRUE THEN 
				iAutoState:=200;
			END_IF
	   110:
	   		IF AutoRdCmd=FALSE AND AutoWrCmd=TRUE THEN
				iStartAddrChangebale:=iStartAddr+128;
	   			BMOV(pbyDataSrc:=pWrTwo , uiSize:=128 , pbyDataDes:=pWrSrcMid);
				RFID_ReadCmd_Mid :=FALSE;
				RFID_WriteCmd_Mid:=TRUE;
				iAutoState:=115;
	   		END_IF
	   115:
			IF Done=TRUE AND RfidErr=FALSE THEN
				GeneralAlarm:=FALSE;
			ELSIF RfidErr THEN
				GeneralAlarm:=TRUE;
			END_IF
			
			IF Done=TRUE AND GeneralAlarm =FALSE THEN
				RFID_ReadCmd_Mid :=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
				iAutoState:=120;
			ELSIF GeneralAlarm=TRUE THEN 
				iAutoState:=200;
			END_IF
	   120:
	   		IF AutoRdCmd=FALSE AND AutoWrCmd=TRUE THEN
				iStartAddrChangebale:=iStartAddr+256;
	   			BMOV(pbyDataSrc:=pWrThree , uiSize:=128 , pbyDataDes:=pWrSrcMid);
				RFID_ReadCmd_Mid :=FALSE;
				RFID_WriteCmd_Mid:=TRUE;
				iAutoState:=125;
	   		END_IF
	   125:
			IF Done=TRUE AND RfidErr=FALSE THEN
				GeneralAlarm:=FALSE;
			ELSIF RfidErr THEN
				GeneralAlarm:=TRUE;
			END_IF
			
			IF Done=TRUE AND GeneralAlarm =FALSE THEN
				RFID_ReadCmd_Mid :=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
				iAutoState:=130;
			ELSIF GeneralAlarm=TRUE THEN 
				iAutoState:=200;
			END_IF
	   130://RFID DATA WRITE FINISHE RETURN
	   		IF GeneralAlarm=FALSE THEN
				RW_Done:=TRUE;
				RFID_ReadCmd_Mid :=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
				iStartAddrChangebale:=0;
	   			iAutoState:=0;
	   		END_IF
	   		
	   200://RFID DATA WRITE OR READ ALARM
			IF OPMODE.User_Interface_OUT.Reset THEN
				GeneralAlarm:=FALSE;
				TagNotExitAlarm:=FALSE;
				RfidNotHeaderAlarm:=FALSE;
				RFID_ReadCmd_Mid:=FALSE;
				RFID_WriteCmd_Mid:=FALSE;
				RW_Done:=FALSE;
				iStartAddrChangebale:=0;
				iAutoState:=0;
			END_IF
		END_CASE
END_IF

实例应用-LD

数据操作功能块封装

功能块封装功能类似数据库读写操作,自动读写数据和手动读写数据,访问二维数组中的数据操作。可通过二维数组的行列访问目标数据或通过指针访问目标数组。

以后有时间会抽时间分享一些TIA和Codesys的常用功能块使用方法。

相关推荐
一个平凡而乐于分享的小比特6 天前
CODESYS V3.5 SP10 移植至 T536 平台实战指南(二)
1024程序员节·codesys·t536
szxinmai主板定制专家6 天前
ARM 还是 x86?CODESYS 数控机床控制器选型、FPGA 取舍与实时性真相
arm开发·人工智能·fpga开发·zynq·1024程序员节·codesys
周永恒9 天前
CODESYS AI实践 - 单元测试
ai·开源·测试·plc·codesys
ControlRookie15 天前
cr-st-expert:一本给 AI 看的《企业级ST标准化编程规范手册》
ai编程·编程规范·codesys·st编程·iec 61131-3
上位机妹子17 天前
汇川 H5U PLC 实战|电机正反转控制(软件互锁)
plc·工控·汇川plc·汇川h5u·plc入门
ControlRookie22 天前
SyncBridge:一个 CODESYS 工程与 AI 之间工程师级的同步工具
git·ai编程·codesys·工业软件·controlrookie
ControlRookie1 个月前
第27篇_综合排障|从现象反查状态、错误码、指标和连接快照
http·codesys·plc通信
szxinmai主板定制专家1 个月前
半导体设备控制器:RK3576+CODESYS+RK182X异构架构,实现晶圆视觉检测与运动联动闭环
人工智能·fpga开发·架构·视觉检测·边缘计算·codesys·rk3576
周永恒1 个月前
Codesys 应用实践 - 上下位机闭环
上位机·plc·codesys
ControlRookie2 个月前
第23篇_源码加更 05|HTTP Server、连接实例和诊断数据
http·codesys·plc通信·开源源码