180 lines
3.4 KiB
C
180 lines
3.4 KiB
C
|
||
#include "main.h"
|
||
|
||
#include "os-app.h"
|
||
|
||
#include <stdio.h>
|
||
#include <rtthread.h>
|
||
#include <net-app.h>
|
||
#include <easyflash.h>
|
||
#include <string.h>
|
||
#include "usart-board.h"
|
||
#include "modbus-s.h"
|
||
#include "modbusaddr.h"
|
||
#include "data.h"
|
||
|
||
|
||
ALIGN (RT_ALIGN_SIZE)
|
||
static char thread_stack[4096];
|
||
static struct rt_thread probus_thread;
|
||
|
||
|
||
#if !defined(LOG_TAG)
|
||
#define LOG_TAG "pbus"
|
||
#endif
|
||
#include <elog.h>
|
||
|
||
|
||
//uint16_t REG_DATA[REG_MAX] = {0x00};
|
||
|
||
|
||
|
||
reg_data_t reg_data =
|
||
{
|
||
.gopen = 56,
|
||
.aload = 0,
|
||
};
|
||
|
||
|
||
|
||
static ModBusSlave_t modbus_slave;
|
||
static uint8_t modbus_rx_data[256];
|
||
|
||
|
||
static void eth2_data_rxdone (void)
|
||
{
|
||
rt_event_send (gUartEvents, EVENT_UART_ETH2_RX);
|
||
|
||
}
|
||
|
||
|
||
static void probus_handle (reg_addr_t addr, uint8_t * data)
|
||
{
|
||
uint32_t data32;
|
||
TypeIndexMail_t mail;
|
||
switch (addr)
|
||
{
|
||
case reg_sopen: // 设定闸门开度
|
||
data32 = data[0];
|
||
data32 = (data32 << 8) + data[1];
|
||
SluiceData[0].sopen = data32 * 10;
|
||
break;
|
||
case reg_slopt: // 执行闸门动作
|
||
rt_kprintf ("reg_slopt\r\n");
|
||
if (data[0] == 0x01) // 执行
|
||
{
|
||
rt_kprintf ("reg_slopt\r\n");
|
||
mail.Type = MAIL_SLUICE_OPT;
|
||
mail.index = 0;
|
||
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||
}
|
||
else
|
||
{
|
||
mail.Type = MAIL_SLUICE_STP;
|
||
mail.index = 0;
|
||
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||
rt_kprintf ("reg_stp\r\n");
|
||
}
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
static void thread_entry (void * argument)
|
||
{
|
||
|
||
int k = 0;
|
||
uint8_t txbuff[128] = {0};
|
||
int tx_size = 0;
|
||
log_i ("probus was start!");
|
||
|
||
g_ETH2Drv.rxdone = eth2_data_rxdone;
|
||
g_ETH2Drv.BaudRate = 115200;
|
||
MX_UART_Init (&g_ETH2Drv);
|
||
|
||
ModbusSlaveInit (&modbus_slave, 0x01, modbus_rx_data, (uint16_t *) ®_data, sizeof (reg_data_t) / 2);
|
||
MX_UART_Clear (&g_ETH2Drv);
|
||
// 注册网络驱动
|
||
// 注册网络驱动
|
||
while (1)
|
||
{
|
||
// 从其他数据区域更新到寄存器
|
||
reg_data.gopen = SluiceData[0].gopen * 10;
|
||
//reg_data.aload = SluiceData[0].lload;
|
||
//reg_data.bload = SluiceData[0].rload;
|
||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_ETH2_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
|
||
{
|
||
// for (int i = 0; i < g_ETH2Drv.rx_size; i++)
|
||
// {
|
||
// rt_kprintf ("%02x", g_ETH2Drv.rx_buffer[i]);
|
||
// }
|
||
if (g_ETH2Drv.rx_size > 4)
|
||
{
|
||
k = ModbusSlaveHandle (&modbus_slave, (uint8_t *) g_ETH2Drv.rx_buffer, g_ETH2Drv.rx_size);
|
||
//k = 2;
|
||
//rt_kprintf ("k:%d\r\n", k);
|
||
if (k == 0)
|
||
{
|
||
switch (modbus_slave.func)
|
||
{
|
||
case 0x03:
|
||
tx_size = ModbusSlavePacket (&modbus_slave, txbuff);
|
||
// 直接返回当前寄存器中的数据
|
||
break;
|
||
case 0x06:
|
||
//处理对应的事件
|
||
probus_handle (modbus_slave.Addr, modbus_slave.data);
|
||
// 数据打包回复
|
||
tx_size = ModbusSlavePacket (&modbus_slave, txbuff);
|
||
break;
|
||
default:
|
||
tx_size = 0;
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
tx_size = 0;
|
||
}
|
||
if (tx_size > 0)
|
||
{
|
||
//rt_kprintf("tx_size :%d\r\n",tx_size);
|
||
MX_UART_PutBuffer (&g_ETH2Drv, (char *) txbuff, tx_size);
|
||
}
|
||
}
|
||
|
||
MX_UART_Clear (&g_ETH2Drv);
|
||
}
|
||
rt_thread_mdelay (100);
|
||
}
|
||
|
||
}
|
||
|
||
void PROBUS_APPThreadStart (void)
|
||
{
|
||
/* 创建线程1,名称是thread1,入口是thread1_entry*/
|
||
rt_thread_init (&probus_thread, "probus_thread",
|
||
thread_entry, RT_NULL,
|
||
&thread_stack[0],
|
||
sizeof (thread_stack),
|
||
PROBUS_APP_THREAD_PRIORITY, PROBUS_APP_THREAD_TIMESLICE);
|
||
rt_thread_startup (&probus_thread);
|
||
|
||
return ;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|