BeckHoff_FB --> SET_SNB 功能块

SET SNB 是工业自动化中 “写入编号参数” 的核心操作,与 GET NSN 形成 “读 - 写” 闭环,共同服务于生产追溯、设备通信和数据管理。其实现通常基于状态机逻辑,包含命令接收、请求发送、响应处理和错误控制等阶段,确保编号设置的可靠性和可追溯性

一、功能块实例化

二、功能块变量声明

*IN variables*)
(*---------------------------------------------*)
VAR_INPUT
	ptIN_STATION_ITAC			:POINTER TO ST_ITAC_V2_0;			(* Data for communication *)

	sSerialNumber	:STRING[cSerialNumberLen];
	iState			:INT := 0;		(*default := 0*)
	uiLayer			:UINT := 2;
	uiSerialNrMode	:UINT;

	bIn_SendCMD		:BOOL;								(* Start send command. Wait for response *)
END_VAR

(*---------------------------------------------*)
(*OUT variables*)
(*---------------------------------------------*)
VAR_OUTPUT
	bOut_ACK				:BOOL;
	bOut_NAK				:BOOL;
END_VAR

(*---------------------------------------------*)
(*Local variables*)
(*---------------------------------------------*)
VAR
	iStep,iStepOld			:INT;
	fbiTonTimeinStep			: TON;
	tTimeinStep				: TIME;
	sArg1			:STRING[MAX_STRING_LENGTH];
	sArg2			:STRING[MAX_STRING_LENGTH];
	FormatString	:FB_FormatString;
	bmerker: BOOL := FALSE;
END_VAR

(*---------------------------------------------*)
(*IN/OUT variables*)
(*---------------------------------------------*)
VAR_IN_OUT

END_VAR

VAR CONSTANT
	tTimeout			:TIME:=t#30s	;
END_VAR

三、功能块 代码

(* Timer *)
IF iStep <> iStepOld THEN
	iStepold := istep;
	fbiTonTimeinStep(IN:= FALSE, PT:= t#1h, Q=> , ET=> tTimeinStep);
ELSE
	fbiTonTimeinStep(IN:= TRUE, PT:= t#1h, Q=> , ET=> tTimeinStep);
END_IF


	CASE iStep OF

	0:(*clear function's return value*)
		bOut_ACK	:= FALSE;
		bOut_NAK	:= FALSE;
		iStep		:= iStep+1;

	1:(* wait for command 	*)
		IF bIn_SendCMD THEN
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bError				:= FALSE;
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecACK				:= FALSE;
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecNAK				:= FALSE;
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText				:= '';
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv		:= '';
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.iStateRecv			:= 0;
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.uiLayerRecv			:= 0;
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv		:= '';

		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.iState				:= iState; (*'1';  (* Serial Production*)*)
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumber			:= sSerialNumber;
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.uiLayer				:= uiLayer;
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.uiSerialNrMode		:= uiSerialNrMode;

		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bSendRequest 			:= TRUE;
			iStep 	:= iStep+1;
		END_IF;


	2:(* wait for answer *)
		IF  ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecACK THEN
			IF sSerialNumber <> ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv THEN
				bmerker := TRUE;
				sArg1 := ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv;
				sArg2 := sSerialNumber;
				FormatString(	sFormat	:= '02| FB_SEQ_iTAC_SET_SNB Recieved SerialNumber [%s] is not matching with sent SerialNumber [%s]',
				    			arg1 	:= F_STRING (sArg1),
								arg2 	:= F_STRING (sArg2),
				 				sOut	=> ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText);
				bOut_NAK   := TRUE;
			ELSE
				bOut_ACK   := TRUE;
			END_IF
			iStep:= iStep +1;
		END_IF

		IF  ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecNAK THEN
		bOut_NAK   := TRUE;
		ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bError				:= TRUE;
			ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText				:= '02| FB_SEQ_iTAC_SET_SNB -> NAK received ';
			iStep:= iStep +1;
		END_IF

		IF tTimeinStep>tTimeout THEN
			bOut_NAK   := TRUE;
			ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecACK				:= FALSE;
			ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecNAK				:= TRUE;
			ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bError				:= TRUE;
			ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText				:= '02| FB_SEQ_iTAC_SET_SNB -> timout ';
			iStep:=iStep +1;
		END_IF


	3: (*END*)

		IF NOT bIn_SendCMD THEN
			iStep:= 0;
		END_IF

	ELSE
		iStep := 3;

	END_CASE;

四、功能块代码说明

1、计时器与状态管理

IF iStep <> iStepOld THEN
    iStepold := iStep;
    fbiTonTimeinStep(IN:= FALSE, PT:= t#1h, Q=> , ET=> tTimeinStep);  // 状态切换时重置计时器
ELSE
    fbiTonTimeinStep(IN:= TRUE, PT:= t#1h, Q=> , ET=> tTimeinStep);   // 持续计时
END_IF;
  • 功能:记录每个状态的持续时间,用于检测通信超时(如超过tTimeout则触发错误)。

2、状态机核心流程

1. 初始化状态(iStep=0)
0: (* 清除输出标志 *)
    bOut_ACK := FALSE;       // 清除确认响应
    bOut_NAK := FALSE;       // 清除否定响应
    iStep := iStep+1;        // 切换到等待命令状态
  • 功能:重置通信结果标志,为新的设置请求做准备。
2. 发送设置请求(iStep=1)

iecst

1: (* 等待发送命令 *)
    IF bIn_SendCMD THEN       // 检测到发送命令
        // 重置通信模块状态
        ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bError := FALSE;
        // ... 清除其他接收标志和错误信息
        
        // 设置SET_SNB参数
        ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.iState := iState;        // 生产状态(如1表示批量生产)
        ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumber := sSerialNumber;  // 待设置的序列号
        ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.uiLayer := uiLayer;      // 生产层级(如产线、工位)
        ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.uiSerialNrMode := uiSerialNrMode;  // 序列号模式
        
        ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bSendRequest := TRUE;    // 触发SET_SNB请求
        iStep := iStep + 1;                                          // 切换到等待响应状态
    END_IF;
  • 功能
    1. 接收到设置命令后,清除历史错误标志。
    2. 配置待设置的序列号、生产状态、层级等参数。
    3. 向 MMC 系统发送 SET_SNB 请求,请求写入序列号信息。
3. 处理响应与错误(iStep=2)
2: (* 等待MMC响应 *)
    IF ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecACK THEN       // 收到确认响应
        // 验证返回的序列号是否与发送值一致
        IF sSerialNumber <> ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv THEN
            bOut_NAK := TRUE;  // 序列号不匹配,返回错误
            // 格式化错误信息
            FormatString(sFormat := '02| FB_SEQ_iTAC_SET_SNB 接收序列号[%s]与发送值[%s]不匹配',
                         arg1 := ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv,
                         arg2 := sSerialNumber,
                         sOut := ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText);
        ELSE
            bOut_ACK := TRUE;  // 验证通过,返回成功
        END_IF;
        iStep := iStep + 1;
    END_IF;

    IF ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecNAK THEN        // 收到否定响应
        bOut_NAK := TRUE;
        ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText := '02| FB_SEQ_iTAC_SET_SNB -> NAK received ';
        iStep := iStep + 1;
    END_IF;

    IF tTimeinStep > tTimeout THEN                             // 超时处理
        bOut_NAK := TRUE;
        ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText := '02| FB_SEQ_iTAC_SET_SNB -> timout ';
        iStep := iStep + 1;
    END_IF;
  • 功能
    1. ACK 响应:验证返回的序列号与发送值是否一致,不一致则记录错误。
    2. NAK 响应:请求被拒绝时记录错误信息。
    3. 超时处理:通信无响应时触发错误,防止系统阻塞。
4. 结束状态(iStep=3)
3: (* 结束状态 *)
    IF NOT bIn_SendCMD THEN  // 发送命令取消时
        iStep := 0;          // 回到初始化状态
    END_IF;
  • 功能:当不再有设置命令时,重置状态机,准备处理下一次请求。

3、工业应用场景

  1. 批次管理:向 MMC 系统设置产品批次号,绑定生产数据(如生产日期、工艺参数)。
  2. 序列号分配:为新产品分配唯一序列号,用于追溯生产流程和质量数据。
  3. 产线状态同步:通过iState参数上报产线状态(如生产中、待机),与 MES 系统同步。

4、与 GET NSN/SET SNR 的协同

  • GET NSN:从 MMC 获取已有编号信息(如物料 NSN)。
  • SET SNR:向 MMC 上报本地生成的序列号。
  • SET SNB:设置序列号块或批次号,三者共同构成 “查询 - 生成 - 绑定” 的数据闭环,支持生产全流程追溯。

5、核心技术要点

  1. 数据验证:通过对比发送与接收的序列号,确保设置操作的准确性。
  2. 错误处理:包含响应验证、超时检测和错误日志记录,提升系统鲁棒性。
  3. 参数配置:支持设置生产状态、层级和序列号模式,适配不同生产场景。

五、附录

执行SET_SNB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三阶码叟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值