📄 hmk.c
字号:
/*************************************************************************/
/* */
/* 版权 (c) 2000-2010 国电南京自动化股份有限公司 */
/* */
/*************************************************************************/
/*************************************************************************/
/* FILE NAME VERSION */
/* */
/* hmk.c 1.0 */
/* */
/* DESCRIPTION */
/* */
/* HMK-10/30D控制器通讯规约 */
/* */
/* HISTORY */
/* */
/* NAME DATE REMARKS */
/* */
/* 宋康 2003.02.21 初始版本 */
/* */
/*************************************************************************/
/*************************************************************************
[通讯设置]
RS485,9600,8,N,1
[遥控点]
1:升压(控合)
2:停止(控分)
3:降压(控分)
[遥测量]
1:档位
2:电压
*************************************************************************/
#include "typedef.h"
#include "nucleus.h"
#include "generic.h"
#include "system.h"
#include "inforec.h"
#include "dev_mng.h"
#include "uart.h"
#include "hmk.h"
/* 通讯端口 */
static WORD m_dev_port=UART_PORT_A;
/* 轮询任务 */
static NU_TASK m_232_task;
static BYTE m_232_stack[0x2000];
static VOID task_232(UNSIGNED argc, VOID *argv);
/* 通讯资源 */
static BYTE m_tx_buf[UART_PACKET_SIZE];
static BYTE m_rx_buf[UART_PACKET_SIZE];
static NU_SEMAPHORE m_com_lock;
/* 内部数据 */
static T_DI m_di; /* 当前遥信状态 */
static T_MEASURE m_ms; /* 当前遥测状态 */
/* 锁定通讯资源 */
#define DEV_LOCK_COM() NU_Obtain_Semaphore(&m_com_lock, NU_SUSPEND)
/* 开放通讯资源 */
#define DEV_UNLOCK_COM() NU_Release_Semaphore(&m_com_lock)
/* 设备创建部分 */
static T_IED g_ied_list[]=
{
{1, hmk_service, 0, 0, {0x52,0x53,0x42,0x4b,0x4c,0x57}},
};
BOOL IED_Initialize()
{
return DEV_Create_IED(g_ied_list, sizeof(g_ied_list)/sizeof(T_IED));
}
/* 接收中断回调函数,用以判断数据帧的结束。*/
static WORD pro_check_packet(const BYTE *p_data, WORD data_len)
{
if (data_len <=4 )
{
return UART_PKT_CON;
}
if (data_len == 5)
{
return UART_PKT_FIN;
}
return UART_PKT_ERR;
}
/* 协议初始化 */
static BOOL pro_initialize()
{
T_UART_CONFIG config;
STATUS status;
if (m_dev_port == UART_PORT_A)
{
config =g_sys_config.uart_a;
}
else if (m_dev_port == UART_PORT_B)
{
config =g_sys_config.uart_b;
}
else
{
return FALSE;
}
// config.pcb =pro_check_packet;
config.pcb =0;
if ( !UART_Open(m_dev_port, &config) )
{
return FALSE;
}
NU_Create_Semaphore(&m_com_lock, "COM_LOCK", 1, NU_FIFO);
status =NU_Create_Task(&m_232_task, "TASK_232", task_232, 0, NU_NULL,
m_232_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START
);
return (status == NU_SUCCESS);
}
/* 设备初始化 */
static BOOL pro_open_ied(const T_IED *p_ied)
{
return TRUE;
}
/* 设备服务接口 */
BOOL hmk_service(T_IED *p_ied, T_MESSAGE *p_msg)
{
BOOL ret_code =FALSE;
/* [初始化部分] */
switch(p_msg->m_type)
{
case MSG_T_INIT:
/* 初始化协议 */
return pro_initialize();
case MSG_T_OPEN:
/* 初始化设备 */
return pro_open_ied((T_IED *)(p_msg->m_data));
default:
break;
}
/* [设备操作接口部分]
如果不支持任何设备操作,可在此处立即返回FALSE.
*/
/* 锁定通讯资源 */
DEV_LOCK_COM();
/* 映射到内部操作接口 */
switch(p_msg->m_type)
{
case MSG_T_CTRL:
if (p_msg->m_flag == MSG_F_CHECK)
{
ret_code =TRUE;
}
else if (p_msg->m_flag == MSG_F_WRITE)
{
ret_code =hmk_remote_control(p_ied, (WORD)(p_msg->m_data));
}
break;
}
/* 开放通讯资源 */
DEV_UNLOCK_COM();
/* 返回操作结果 */
return ret_code;
}
static BYTE calc_check_sum(const BYTE *p_data, WORD data_len)
{
WORD i;
BYTE sum =0;
for (i =0; i < data_len; i++)
{
sum += p_data[i];
}
return sum;
}
static BOOL modbus_multiple_write(BYTE h_comm, BYTE l_comm)
{
// WORD i;
// WORD pkt_len, crc;
m_tx_buf[0] =0x01;
m_tx_buf[1] =0x05;
m_tx_buf[2] =h_comm;
m_tx_buf[3] =l_comm;
m_tx_buf[4] =calc_check_sum(m_tx_buf, 4);
UART_Write(m_dev_port, m_tx_buf, 5);
return TRUE;
}
BOOL hmk_remote_control(T_IED *p_ied, WORD ctrl_no)
{
if (ctrl_no == 2) /* improve voltage */
{
modbus_multiple_write(p_ied->dev_data[0],p_ied->dev_data[1]);
return TRUE;
}
if (ctrl_no == 3) /* stop */
{
modbus_multiple_write(p_ied->dev_data[2],p_ied->dev_data[3]);
return TRUE;
}
if (ctrl_no == 5) /* reduce voltage */
{
modbus_multiple_write(p_ied->dev_data[4],p_ied->dev_data[5]);
return TRUE;
}
return FALSE;
}
/* read position */
static BOOL hmk_get_dw(T_IED *p_ied)
{
int pkt_len;
BYTE crc;
m_tx_buf[0] =0x01;
m_tx_buf[1] =0x05;
m_tx_buf[2] =0x54;
m_tx_buf[3] =0x50;
m_tx_buf[4] =0xaa;
if ( !UART_Write(m_dev_port, m_tx_buf, 5) )
{
return FALSE;
}
pkt_len =UART_Read(m_dev_port, m_rx_buf, 1000);
if (pkt_len !=5)
{
return FALSE;
}
crc =calc_check_sum(m_rx_buf, 4);
if (crc !=m_rx_buf[4])
{
return FALSE;
}
m_ms.ms_val[0] =MAKEWORD(m_rx_buf[3],m_rx_buf[2]) * 2;
INF_Set_Measure(1, &m_ms);
return TRUE;
}
/* read voltage */
static BOOL hmk_get_dy(T_IED *p_ied)
{
int pkt_len;
// T_MEASURE ms;
BYTE crc;
m_tx_buf[0] =0x01;
m_tx_buf[1] =0x05;
m_tx_buf[2] =0x56;
m_tx_buf[3] =0x54;
m_tx_buf[4] =0xb0;
if ( !UART_Write(m_dev_port, m_tx_buf, 5) )
{
return FALSE;
}
pkt_len =UART_Read(m_dev_port, m_rx_buf, 1000);
if (pkt_len !=5)
{
return FALSE;
}
crc =calc_check_sum(m_rx_buf, 4);
if (crc !=m_rx_buf[4])
{
return FALSE;
}
m_ms.ms_val[1] =MAKEWORD(m_rx_buf[3],m_rx_buf[2]);
INF_Set_Measure(1, &m_ms);
return TRUE;
}
/* hmk's task */
static VOID task_232(UNSIGNED argc, VOID *argv)
{
T_IED *p_ied;
BOOL com_ok1;
BOOL com_ok2;
m_ms.ms_num =2;
Loop232:
p_ied =DEV_First_IED();
while (p_ied != 0)
{
if (p_ied->dev_if == hmk_service)
{
DEV_LOCK_COM();
com_ok1 =hmk_get_dw(p_ied);
DEV_UNLOCK_COM();
DEV_LOCK_COM();
com_ok2 =hmk_get_dy(p_ied);
DEV_UNLOCK_COM();
if(com_ok1 || com_ok2)
p_ied->dev_flag |=DEV_F_ONLINE;
else
p_ied->dev_flag &=~DEV_F_ONLINE;
}
p_ied =DEV_Next_IED(p_ied->dev_id);
}
NU_Sleep(3*SYS_SECOND_TICKS);
goto Loop232;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -