⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hmk.c

📁 又一个机密的东东,参考它,可以写出其他设备的通讯规约转换代码,"钱"途无量!
💻 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 + -