器件型号: AM2434
您好:
我在使用汇编集回调时遇到问题。 汇编语言配置为具有 32 位运行/空闲标头、以检测空闲状态。 在运行状态期间、无需发出回调、我可以处理从 PLC 获得的数据 但在 IDLE 状态下、即使切换到运行并返回 IDLE、也会调用一次回调、绝不会再次调用。 当我尝试了解离散 IO 示例的代码时、我没有看到任何要清除的标志或调用空闲处理的特殊方法。 您能向我指出正确的方向、以便在空闲状态下调用回调吗?
下面是我的装配体创建:
static uint32_t createAsmOutput(EI_API_CIP_NODE_T* pCipNode) {
uint32_t errCode = EI_API_CIP_eERR_OK;
uint16_t len;
EI_API_CIP_SAssemCustomMap_t assembCustomMapCfg = {0};
errCode = EI_API_CIP_createAssembly(pCipNode, DEVICE_asmCfgParam.asmOutputInst, EI_API_CIP_eAR_GET_AND_SET);
if (errCode != EI_API_CIP_eERR_OK) {
OSAL_printf("Error: %s:%d ErrCode:0x%08X\r\n", __FILE__, __LINE__, errCode);
return errCode;
}
errCode = EI_API_CIP_setAssemblyFormat(pCipNode, DEVICE_asmCfgParam.asmOutputInst, ASSEMB_FORMAT_32BITHEADER);
if (errCode != EI_API_CIP_eERR_OK) {
OSAL_printf("Error: %s:%d ErrCode:0x%08X\r\n", __FILE__, __LINE__, errCode);
return errCode;
}
assembCustomMapCfg.assemblyMemberLength =DEVICE_asmCfgParam.asmOutputLen;
assembCustomMapCfg.mappedClassId = DEVICE_PROFILE_CIP_CLASS_ID_SOLENOID;
assembCustomMapCfg.mappedInstanceId = DEVICE_PROFILE_CIP_INSTANCE_ID_01;
assembCustomMapCfg.mappedAttributeId = k_INST_ATTR_ID_SOLENOID_VALUE;
assembCustomMapCfg.fuCustomGet = cbGetCustomMapAsmOut;
assembCustomMapCfg.fuCustomSet = cbSetCustomMapAsmOut;
errCode = EI_API_CIP_addAssemblyMemberCustomMapped(pCipNode, DEVICE_asmCfgParam.asmOutputInst, &assembCustomMapCfg);
if (errCode != EI_API_CIP_eERR_OK) {
OSAL_printf("Error: %s:%d ErrCode:0x%08X\r\n", __FILE__, __LINE__, errCode);
return errCode;
}
EI_API_CIP_getAssemblySize(pCipNode, DEVICE_asmCfgParam.asmOutputInst, &len);
if (len != DEVICE_asmCfgParam.asmOutputLen) {
OSAL_printf("Wrong assembly output length!\r\n");
return -1;
}
return errCode;
}
这里是对 set 回调的处理:
static EI_API_CIP_EAssemb_Return_Code_t cbSetCustomMapAsmOut(EI_API_CIP_SAssemMapData_t* pAttrMapData, const EI_API_CIP_STransferBuffer_t* pConsumeBuffer) {
EI_API_CIP_EAssemb_Return_Code_t retValue = ASSEMB_SERVICE_NO_RESPONSE;
uint16_t dataLen;
OSAL_printf("ASM data set\r\n");
if (DEVICE_PROFILE_CIP_CLASS_ID_SOLENOID != pAttrMapData->classId) {
return retValue;
}
if (pAttrMapData->instanceId > 0) {
if (k_INST_ATTR_ID_SOLENOID_VALUE == pAttrMapData->attributeId)
{
OSAL_printf("ASM data set\r\n");
if(pConsumeBuffer->p8uDataBuf[0] == 0) //Idle state
{
OSAL_printf("Idle Detected\r\n");
if(ConnectionIdle == false)
{
// change state from run to idle
DEVICE_receiveConnectionEvent(pAttrMapData->attributeId, DEVICE_CONNECTION_DELETED);
}
ConnectionIdle = true;
retValue = ASSEMB_SERVICE_RESPONSE_OK;
}
else
{
if(ConnectionIdle == true)
{
// change state from idle to run
DEVICE_receiveConnectionEvent(pAttrMapData->attributeId, DEVICE_CONNECTION_ESTABLISHED_IO);
}
ConnectionIdle = false;
dataLen = pConsumeBuffer->u16uMaxData;
if (dataLen > MAX_SOLENOID_BYTES) {
dataLen = MAX_SOLENOID_BYTES;
}
OSAL_MEMORY_memcpy(ab_BitMapSolenoidValue, pConsumeBuffer->p8uDataBuf + 4, dataLen); // +4 for header
retValue = ASSEMB_SERVICE_RESPONSE_OK;
}
}
}
return retValue;
}
device_receiveConnectionEvent 仅更改状态机箱、以确定应该将哪些值用于输出到运行或空闲。
感谢你的帮助。
此致、
1 月



