倍福 PLC程序解读
一、倍福PLC与 ITAC(工业通信协议或设备)交互的逻辑控制
IF stINOUT_Adjust.stMachineData.bDeactivateITAC THENstvar_seq.bTOK := stvar_seq.bRelease;RETURN;
END_IF
stProcessData.sStrData:=stGV_SYS_ELEMENTS.arstELEMENT[idxScanner].stText.str[1];IF PRG_Cell2.st_RECIPE.stLoadedRecipe.uiPartTypeID = 1 THENtSerialNumber := stProcessData.sStrData; ELSEtSerialNumber := MID(STR:= stProcessData.sStrData, LEN:=16 ,POS:=42); END_IF(*fbiSEQ_iTAC_SET_ASN.sSerialNumber:=tSerialNumber;
fbiSEQ_iTAC_SET_ASN.bIn_SendCMD:= TRUE;*)
fbiSEQ_iTAC_GET_SNC.sIN_SerialNumber:=tSerialNumber;
fbiSEQ_iTAC_GET_SNC.bIn_SendCMD:= TRUE;IF (*fbiSEQ_iTAC_SET_ASN.bOUT_ACK *)fbiSEQ_iTAC_GET_SNC.bOUT_ACK THENstProcessData.uiResult:=101; // Assign End stVar_SEQ.stStep.enNextTransition := labelA; stvar_seq.bTOK := TRUE;END_IFIF fbiSEQ_iTAC_GET_SNC.bOUT_NAK THENstVar_SEQ.stStep.enNextTransition := labelB; stvar_seq.bTOK := TRUE;END_IFIF (stvar_seq.stXTimes.tTimeInStep > T#10S)AND NOT fbiSEQ_iTAC_GET_SNC.bOUT_NAK AND NOT fbiSEQ_iTAC_GET_SNC.bOUT_ACK THENwINOUT_DIAGNOSE_Seq.11 := TRUE;fbiSEQ_iTAC_SET_ASN.bIn_SendCMD := FALSE;IF stINOUT_SYS_CELL.stMODE.bQUITT_ERRORS THENstvar_seq.stXTimes.tTimeInStep := t#0s;END_IFEND_IF
二、程序解读
1. 激活状态检查与初步处理
IF stINOUT_Adjust.stMachineData.bDeactivateITAC THENstvar_seq.bTOK := stvar_seq.bRelease;RETURN;
END_IF
stProcessData.sStrData:=stGV_SYS_ELEMENTS.arstELEMENT[idxScanner].stText.str[1];
- 如果设备处于停用 ITAC 状态(
bDeactivateITAC
为真),则将bTOK
设为bRelease
的值并直接返回,终止当前程序执行。 - 否则,从系统元素数组中获取扫描器的文本数据,存入
stProcessData.sStrData
。
2. 序列号处理逻辑
IF PRG_Cell2.st_RECIPE.stLoadedRecipe.uiPartTypeID = 1 THENtSerialNumber := stProcessData.sStrData; ELSEtSerialNumber := MID(STR:= stProcessData.sStrData, LEN:=16 ,POS:=42);
END_IF
- 根据加载的配方类型(
uiPartTypeID
)决定如何处理序列号:- 若类型为 1,则直接使用完整的扫描数据作为序列号。
- 否则,从扫描数据的第 42 位开始截取 16 个字符作为序列号。
3. ITAC 通信请求
fbiSEQ_iTAC_GET_SNC.sIN_SerialNumber:=tSerialNumber;
fbiSEQ_iTAC_GET_SNC.bIn_SendCMD:= TRUE;
- 将处理好的序列号赋值给 ITAC 通信功能块
fbiSEQ_iTAC_GET_SNC
的输入参数。 - 发送命令请求,触发 ITAC 系统获取序列号状态。
4. 响应处理
IF fbiSEQ_iTAC_GET_SNC.bOUT_ACK THENstProcessData.uiResult:=101; // Assign End stVar_SEQ.stStep.enNextTransition := labelA; stvar_seq.bTOK := TRUE;
END_IFIF fbiSEQ_iTAC_GET_SNC.bOUT_NAK THENstVar_SEQ.stStep.enNextTransition := labelB; stvar_seq.bTOK := TRUE;
END_IF
- 成功响应(ACK):设置处理结果为 101(可能表示成功),将下一步转换设置为
labelA
,并将bTOK
置为真。 - 失败响应(NAK):将下一步转换设置为
labelB
,并将bTOK
置为真。
5. 超时处理
IF (stvar_seq.stXTimes.tTimeInStep > T#10S) AND NOT fbiSEQ_iTAC_GET_SNC.bOUT_NAK AND NOT fbiSEQ_iTAC_GET_SNC.bOUT_ACK THENwINOUT_DIAGNOSE_Seq.11 := TRUE;fbiSEQ_iTAC_SET_ASN.bIn_SendCMD := FALSE;IF stINOUT_SYS_CELL.stMODE.bQUITT_ERRORS THENstvar_seq.stXTimes.tTimeInStep := t#0s;END_IF
END_IF
- 如果在步骤中停留时间超过 10 秒,且未收到成功或失败响应:
- 设置诊断位 11(可能表示超时错误)。
- 停止发送 ITAC 命令。
- 如果系统处于允许退出错误状态,则重置步骤计时器。
总结
这段代码实现了一个与 ITAC 系统通信的完整流程,包括条件判断、数据处理、通信控制、响应处理和超时处理。通过状态机模式(labelA
和labelB
)控制流程走向,确保系统在各种情况下都能正确响应。