[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的常用功能块使用方法。

相关推荐
ControlRookie1 天前
SyncBridge:一个 CODESYS 工程与 AI 之间工程师级的同步工具
git·ai编程·codesys·工业软件·controlrookie
ControlRookie8 天前
第27篇_综合排障|从现象反查状态、错误码、指标和连接快照
http·codesys·plc通信
szxinmai主板定制专家10 天前
半导体设备控制器:RK3576+CODESYS+RK182X异构架构,实现晶圆视觉检测与运动联动闭环
人工智能·fpga开发·架构·视觉检测·边缘计算·codesys·rk3576
周永恒23 天前
Codesys 应用实践 - 上下位机闭环
上位机·plc·codesys
ControlRookie1 个月前
第23篇_源码加更 05|HTTP Server、连接实例和诊断数据
http·codesys·plc通信·开源源码
ControlRookie1 个月前
第22篇_源码加更 04|chunked 解码器和十六进制块长度解析
http·codesys·plc通信·开源源码
知无不研1 个月前
std::function在使用时遇到的问题
c++·算法·st·function
会周易的程序员1 个月前
aiDgeController 软PLC虚拟机stvm集成测试报告
c++·物联网·架构·集成测试·st·软plc·iec61131
会周易的程序员2 个月前
aiDgePLC iec61131 虚拟机 完整使用文档
c++·物联网·架构·st·iec61131
ControlRookie2 个月前
第15篇_Client 04|GET、POST 和 Body 怎样保持一致
http·codesys·plc通信·controlrookie