检查数据存档文件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;
- }
|