检查数据存档文件sdo并判断下一步要做什么动作
/* 检查数据存档文件sdo并判断下一步要做什么动作 */
static void CheckSDOAndContinue(CO_Data *d, UNS8 nodeId)
{
UNS32 abortCode = 0;
UNS8 buf[4], match = 0;
UNS32 size = 4;
/* 如果状态为读取检查,说明已经开始读取 */
if(d->dcf_status == DCF_STATUS_READ_CHECK)
{
/* 获取sdo读取到的结果 */
if(getReadResultNetworkDict(d, nodeId, buf, &size, &abortCode) != SDO_FINISHED)
goto dcferror;
/* 检查读取到的大小和本地配置的是否匹配 */
if(size == d->dcf_size)
{
match = 1;
/* 检查读取到的内容和配置的是否匹配 */
while(size--)
{
if(buf[size] != d->dcf_data[size])
match = 0;
}
}
/* 如果匹配,继续读取该节点数据存档文件中配置的下一个条目 */
if(match)
{
/* 如果已经读完该节点配置的数据存档文件中的所有条目 */
if(read_consise_dcf_next_entry(d, nodeId) == 0)
{
/* 开始并检查节点 */
start_and_seek_node(d, nodeId);
}
}
/* 如果读取的数据存档文件和配置的数据存档文件不匹配,则将配置数据存档文件写到节点字典中 */
else
{
/* 初始化节点nodeId的数据存档文件,写数据存档指针指向的条目数据并将指针偏移到下一个条目 */
if((init_consise_dcf(d, nodeId) == 0) || (write_consise_dcf_next_entry(d, nodeId) == 0))
goto dcferror;
/* 将状态配置为写 */
d->dcf_status = DCF_STATUS_WRITE;
}
}
/* 如果状态为写 */
else if(d->dcf_status == DCF_STATUS_WRITE)
{
/* 检查写字典结果是否成功 */
if(getWriteResultNetworkDict(d, nodeId, &abortCode) != SDO_FINISHED)
goto dcferror;
/* 写该节点数据存档文件中指针指向的条目的数据,并将指针偏移到该节点配置的下一个条目 */
if(write_consise_dcf_next_entry(d, nodeId) == 0)
{
#ifdef DCF_SAVE_NODE
/* 所有条目都写完,通知从站保存字典到非易失性存储器 */
SaveNode(d, nodeId);
/* 将状态设置为保存 */
d->dcf_status = DCF_STATUS_SAVED;
#else
/* 所有条目都写完,将状态设置为初始化 */
d->dcf_status = DCF_STATUS_INIT;
/* 启动该节点并检查是否有其它节点还未进入运行态,如果有则检查是否要获取数据存档文件并启动其它节点 */
start_and_seek_node(d,nodeId);
#endif
}
}
/* 保存状态 */
else if(d->dcf_status == DCF_STATUS_SAVED)
{
/* 检查是否写成功 */
if(getWriteResultNetworkDict(d, nodeId, &abortCode) != SDO_FINISHED)
goto dcferror;
/* 重启节点 */
masterSendNMTstateChange(d, nodeId, NMT_Reset_Node);
/* 如果保存完该节点后,需要将数据存档入口状态设置初始化 */
d->dcf_status = DCF_STATUS_INIT;
/* 因为节点重启还会boot_up,因此将节点状态设置为未知状态 */
d->NMTable[nodeId] = Unknown_state;
}
return;
dcferror:
MSG_ERR(0x1A01, "SDO error in consise DCF", abortCode);
MSG_WAR(0x2A02, "server node : ", nodeId);
d->NMTable[nodeId] = Unknown_state;
}
|