主芯片:3687
编译环境:HEW2
语言:C
协议:ModbusTCP(对上位机),ModbusRTU(对被控制设备)
结构:PC(上位机)-RS232-程序所在设备-RS485总线-被控制设备×N
功能:程序所在设备负责对被控设备×N作不间断论询,将其信息保存在内存中,当上位机询问时提供给
上位机。由此产生的问题是,当上位机需要控制被控制设备时,无法实时相应动作,因为此时可能正在论
询信息,因此需要保存数条上位机对被控制设备的控制指令,以便在485可相应间歇对被控设备进行控制
。
因为内存有限:4K。并且不允许使用malloc作动态内存分配,而且工控设备对程序稳定性要求较高。最后
采用固定长度的指令队列处理该问题。
数据结构:
typedef struct _tagHead
{
unsigned char * pHead;
int nSize;
}tagHead;
typedef struct _tagTaskQueue
{
tagHead headVec[TASKQUEUE_SIZE];
int nCurPos;
int nCurSize;
int nMaxSize;
}tagTaskQueue;
函数接口:
//初始化队列
void InitTaskQueue(tagTaskQueue * ptq);
//为队列赋指针
int AddHeadToTaskQueue(tagTaskQueue * ptq, unsigned char *pHead);
//入队列
void PushTaskQueue(tagTaskQueue * ptq, unsigned char *pBuffer, int nSize);
//出队列
unsigned char *PopTaskQueue(tagTaskQueue * ptq, unsigned char *pBufferOut, int *nSizeOut);
使用:
初始化队列InitTaskQueue();
先分配一段全局u8数组给队列AddHeadToTaskQueue()
再使用时作PushTaskQueue() / PopTaskQueue() 操作即可。
使用这种简易队列结构可以在使用前就分配完内存,保证指令保存成功性,通过简单的Push/Pop接口可以
保持程序的简洁性。实现很简单,使用方面很稳定,设备在现场跑了数个月,未出问题。