BeckHoff_FB --> GET_NSN功能块

GET NSN 是工业自动化和控制系统中用于 ** 获取序列号(Serial Number)** 相关信息的功能块。它通过通信协议(如 TCP/IP、OPC UA)与企业资源规划(ERP)、制造执行系统(MES)或仓储系统交互,获取物料、设备或产品的详细数据。

一、功能块实例化

二、功能块变量声明

(*IN variables*)
(*---------------------------------------------*)
VAR_INPUT
	ptIN_STATION_ITAC	:POINTER TO ST_ITAC_V2_0;			(* Data for communication *)
	uiAssignSNR			:UINT ;
 	bIN_SendCMD			:BOOL;								(* Start send command. Wait for response *)
END_VAR

(*---------------------------------------------*)
(*OUT variables*)
(*---------------------------------------------*)
VAR_OUTPUT
	bOUT_ACK				:BOOL;
	bOUT_NAK				:BOOL;
	sOUTSNRRecv				:STRING[MAX_STRING_LENGTH];
END_VAR


(*---------------------------------------------*)
(*Local variables*)
(*---------------------------------------------*)
VAR
	iStep,iStepOld			:INT;
	fbiTonTimeinStep			: TON;
	tTimeinStep				: TIME;
	itest: INT;
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;
		sOUTSNRRecv			:='';
		iStep 	:= 1;

	1:(* wait for command 	*)
		IF bIN_SendCMD THEN

			ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bError				:= FALSE;
			ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecACK				:= FALSE;
			ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecNAK				:= FALSE;
			ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sErrText			:= ''; 
			ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sSNRREC				:= '';

			
			ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.uiAssignSNR		:= uiAssignSNR; 

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


	2:(* wait for answer *)
		IF ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecACK THEN
			sOUTSNRRecv := ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sSNRREC;
			bOUT_ACK   				:= TRUE;
			iStep:= iStep +1;
		END_IF

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

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

	3: (*END*)
	 
		 IF NOT  bIN_SendCMD    THEN
		 	iStep:= 0;
		  END_IF

	ELSE
		iStep :=0;


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;       // 清除否定响应
    sOUTSNRRecv := '';       // 清空接收的序列号
    iStep := 1;              // 切换到等待命令状态
  • 功能:重置输出信号,为新的查询请求做准备。
2. 发送查询请求(iStep=1)
1: (* 等待发送命令 *)
    IF bIN_SendCMD THEN       // 检测到发送命令
        // 重置通信模块状态
        ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bError := FALSE;
        // ... 清除其他接收标志和错误信息
        
        ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.uiAssignSNR := uiAssignSNR;  // 设置SNR分配模式
        ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bSendRequest := TRUE;        // 触发NSN查询请求
        iStep := iStep + 1;                                              // 切换到等待响应状态
    END_IF;
  • 功能
    1. 接收到查询命令后,清除历史错误标志。
    2. 通过uiAssignSNR参数配置查询模式(如按物料编号或序列号查询)。
    3. 向 MMC 系统发送 GET_NSN 请求。
3. 处理响应与错误(iStep=2)
2: (* 等待MMC响应 *)
    IF ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecACK THEN       // 收到确认响应
        sOUTSNRRecv := ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sSNRREC;  // 提取返回的序列号
        bOUT_ACK := TRUE;                                        // 标记请求成功
        iStep := iStep + 1;
    END_IF;

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

    IF tTimeinStep > tTimeout THEN                             // 超时处理
        bOUT_NAK := TRUE;
        ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sErrText := '02| FB_SEQ_iTAC_GET_NSN -> timout ';
        iStep := iStep + 1;
    END_IF;
  • 功能
    1. ACK 响应:成功接收 NSN 数据,将序列号存入sOUTSNRRecv
    2. NAK 响应:请求被拒绝,记录错误信息。
    3. 超时处理:通信无响应时触发错误,防止系统阻塞。
4. 结束状态(iStep=3)
3: (* 结束状态 *)
    IF NOT bIN_SendCMD THEN  // 发送命令取消时
        iStep := 0;          // 回到初始化状态
    END_IF;
  • 功能:当不再有查询命令时,重置状态机,准备处理下一次请求。

3、工业应用场景

  1. 物料追溯:通过 NSN 查询物料的供应商、批次、库存位置等信息。
  2. 生产配置:获取序列号对应的工艺参数(如加工步骤、质量标准)。
  3. 自动化仓储:与货架系统集成,自动定位 NSN 对应的物料存放位置。

4、与 SET SNR 的协同

  • SET SNR:向 MMC 系统上报本地生成的序列号及生产数据。
  • GET NSN:从 MMC 系统获取预定义的 NSN 或序列号关联的物料信息。
  • 协同场景:生产线上通过 GET NSN 获取物料信息后,使用 SET SNR 上报加工结果,实现全流程追溯。

5、核心技术要点

  1. 通信可靠性:通过 ACK/NAK 响应和超时机制确保数据交互稳定。
  2. 参数配置uiAssignSNR控制查询模式(如按序列号分配或按物料编号查询)。
  3. 数据流向:请求由本地系统发起,MMC 返回结构化的 NSN 数据(如sSNRREC)。

五、附录

1、功能块调用树

2、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三阶码叟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值