diff options
| author | Bernard Xiong <[email protected]> | 2015-03-05 06:22:35 +0000 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2015-03-05 06:22:35 +0000 |
| commit | e984da7f7120aa2103ac8ce63fb7905b416b0676 (patch) | |
| tree | d00d0f0e8be003557a54e0e188ed09c47eb7b337 /components | |
| parent | 570e2ffbe74c20914e6942ecf6402b66ce61ac6b (diff) | |
| parent | 584efccad14686a5cc9629d26c1df6f1be173d5f (diff) | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'components')
| -rw-r--r-- | components/net/freemodbus-v1.6.0/port/portserial.c | 189 | ||||
| -rw-r--r-- | components/net/freemodbus-v1.6.0/port/portserial_m.c | 192 | ||||
| -rw-r--r-- | components/net/freemodbus-v1.6.0/port/porttimer.c | 107 | ||||
| -rw-r--r-- | components/net/freemodbus-v1.6.0/port/porttimer_m.c | 157 | ||||
| -rw-r--r-- | components/net/freemodbus-v1.6.0/port/user_mb_app.c | 349 | ||||
| -rw-r--r-- | components/net/freemodbus-v1.6.0/port/user_mb_app.h | 54 | ||||
| -rw-r--r-- | components/net/freemodbus/Changelog.txt (renamed from components/net/freemodbus-v1.6.0/Changelog.txt) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/SConscript (renamed from components/net/freemodbus-v1.6.0/SConscript) | 5 | ||||
| -rw-r--r-- | components/net/freemodbus/bsd.txt (renamed from components/net/freemodbus-v1.6.0/bsd.txt) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/gpl.txt (renamed from components/net/freemodbus-v1.6.0/gpl.txt) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/lgpl.txt (renamed from components/net/freemodbus-v1.6.0/lgpl.txt) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/ascii/mbascii.c (renamed from components/net/freemodbus-v1.6.0/modbus/ascii/mbascii.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/ascii/mbascii.h (renamed from components/net/freemodbus-v1.6.0/modbus/ascii/mbascii.h) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbfunccoils.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbfunccoils.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbfunccoils_m.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbfunccoils_m.c) | 73 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbfuncdiag.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbfuncdiag.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbfuncdisc.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbfuncdisc.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbfuncdisc_m.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbfuncdisc_m.c) | 28 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbfuncholding.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbfuncholding.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbfuncholding_m.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbfuncholding_m.c) | 101 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbfuncinput.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbfuncinput.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbfuncinput_m.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbfuncinput_m.c) | 28 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbfuncother.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbfuncother.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/functions/mbutils.c (renamed from components/net/freemodbus-v1.6.0/modbus/functions/mbutils.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/include/mb.h (renamed from components/net/freemodbus-v1.6.0/modbus/include/mb.h) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/include/mb_m.h (renamed from components/net/freemodbus-v1.6.0/modbus/include/mb_m.h) | 180 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/include/mbconfig.h (renamed from components/net/freemodbus-v1.6.0/modbus/include/mbconfig.h) | 6 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/include/mbframe.h (renamed from components/net/freemodbus-v1.6.0/modbus/include/mbframe.h) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/include/mbfunc.h (renamed from components/net/freemodbus-v1.6.0/modbus/include/mbfunc.h) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/include/mbport.h (renamed from components/net/freemodbus-v1.6.0/modbus/include/mbport.h) | 50 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/include/mbproto.h (renamed from components/net/freemodbus-v1.6.0/modbus/include/mbproto.h) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/include/mbutils.h (renamed from components/net/freemodbus-v1.6.0/modbus/include/mbutils.h) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/mb.c (renamed from components/net/freemodbus-v1.6.0/modbus/mb.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/mb_m.c (renamed from components/net/freemodbus-v1.6.0/modbus/mb_m.c) | 114 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/rtu/mbcrc.c (renamed from components/net/freemodbus-v1.6.0/modbus/rtu/mbcrc.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/rtu/mbcrc.h (renamed from components/net/freemodbus-v1.6.0/modbus/rtu/mbcrc.h) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/rtu/mbrtu.c (renamed from components/net/freemodbus-v1.6.0/modbus/rtu/mbrtu.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/rtu/mbrtu.h (renamed from components/net/freemodbus-v1.6.0/modbus/rtu/mbrtu.h) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/rtu/mbrtu_m.c (renamed from components/net/freemodbus-v1.6.0/modbus/rtu/mbrtu_m.c) | 36 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/tcp/mbtcp.c (renamed from components/net/freemodbus-v1.6.0/modbus/tcp/mbtcp.c) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/modbus/tcp/mbtcp.h (renamed from components/net/freemodbus-v1.6.0/modbus/tcp/mbtcp.h) | 0 | ||||
| -rw-r--r-- | components/net/freemodbus/port/port.c (renamed from components/net/freemodbus-v1.6.0/port/port.c) | 15 | ||||
| -rw-r--r-- | components/net/freemodbus/port/port.h (renamed from components/net/freemodbus-v1.6.0/port/port.h) | 20 | ||||
| -rw-r--r-- | components/net/freemodbus/port/portevent.c (renamed from components/net/freemodbus-v1.6.0/port/portevent.c) | 38 | ||||
| -rw-r--r-- | components/net/freemodbus/port/portevent_m.c | 239 | ||||
| -rw-r--r-- | components/net/freemodbus/port/portserial.c | 222 | ||||
| -rw-r--r-- | components/net/freemodbus/port/portserial_m.c | 225 | ||||
| -rw-r--r-- | components/net/freemodbus/port/porttimer.c (renamed from components/net/freemodbus-v1.6.0/port/portevent_m.c) | 52 | ||||
| -rw-r--r-- | components/net/freemodbus/port/porttimer_m.c | 107 | ||||
| -rw-r--r-- | components/net/freemodbus/port/user_mb_app.c | 286 | ||||
| -rw-r--r-- | components/net/freemodbus/port/user_mb_app.h | 46 | ||||
| -rw-r--r-- | components/net/freemodbus/port/user_mb_app_m.c | 294 |
52 files changed, 1980 insertions, 1233 deletions
diff --git a/components/net/freemodbus-v1.6.0/port/portserial.c b/components/net/freemodbus-v1.6.0/port/portserial.c deleted file mode 100644 index 3768702087..0000000000 --- a/components/net/freemodbus-v1.6.0/port/portserial.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * FreeModbus Libary: STM32 Port - * Copyright (C) 2013 Armink <[email protected]> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: portserial.c,v 1.60 2013/08/13 15:07:05 Armink $ - */ - -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" -/* ----------------------- static functions ---------------------------------*/ -static void prvvUARTTxReadyISR(void); -static void prvvUARTRxISR(void); -/* ----------------------- Start implementation -----------------------------*/ - -void vMBPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable) -{ - if (xRxEnable) - { - SLAVE_RS485_RECEIVE_MODE; - USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); - } - else - { - SLAVE_RS485_SEND_MODE; - USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); - } - if (xTxEnable) - { - USART_ITConfig(USART1, USART_IT_TXE, ENABLE); - } - else - { - USART_ITConfig(USART1, USART_IT_TXE, DISABLE); - } -} - -void vMBPortClose(void) -{ - USART_ITConfig(USART1, USART_IT_TXE | USART_IT_RXNE, DISABLE); - USART_Cmd(USART1, DISABLE); -} -//Ĭ��һ���ӻ� ����1 �����ʿ����� ��ż��������� -BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, - eMBParity eParity) -{ - GPIO_InitTypeDef GPIO_InitStructure; - USART_InitTypeDef USART_InitStructure; - NVIC_InitTypeDef NVIC_InitStructure; - //======================ʱ�ӳ�ʼ��======================================= - RCC_APB2PeriphClockCmd( - RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_USART1, - ENABLE); - //======================IO��ʼ��======================================= - //USART1_TX - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; - GPIO_Init(GPIOA, &GPIO_InitStructure); - //USART1_RX - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; - GPIO_Init(GPIOA, &GPIO_InitStructure); - //����485���ͺͽ���ģʽ -// TODO ��ʱ��дB13 ��֮����������ʱ���� - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; - GPIO_Init(GPIOB, &GPIO_InitStructure); - //======================���ڳ�ʼ��======================================= - USART_InitStructure.USART_BaudRate = ulBaudRate; - //����У��ģʽ - switch (eParity) - { - case MB_PAR_NONE: //��У�� - USART_InitStructure.USART_Parity = USART_Parity_No; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - break; - case MB_PAR_ODD: //��У�� - USART_InitStructure.USART_Parity = USART_Parity_Odd; - USART_InitStructure.USART_WordLength = USART_WordLength_9b; - break; - case MB_PAR_EVEN: //żУ�� - USART_InitStructure.USART_Parity = USART_Parity_Even; - USART_InitStructure.USART_WordLength = USART_WordLength_9b; - break; - default: - return FALSE; - } - - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_HardwareFlowControl = - USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - if (ucPORT != 1) - return FALSE; - - ENTER_CRITICAL_SECTION(); //��ȫ���ж� - - USART_Init(USART1, &USART_InitStructure); - USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); - USART_Cmd(USART1, ENABLE); - - //=====================�жϳ�ʼ��====================================== - //����NVIC���ȼ�����ΪGroup2��0-3��ռʽ���ȼ���0-3����Ӧʽ���ȼ� - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); - NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - EXIT_CRITICAL_SECTION(); //��ȫ���ж� - - return TRUE; -} - -BOOL xMBPortSerialPutByte(CHAR ucByte) -{ - USART_SendData(USART1, ucByte); - return TRUE; -} - -BOOL xMBPortSerialGetByte(CHAR * pucByte) -{ - *pucByte = USART_ReceiveData(USART1); - return TRUE; -} - -/* - * Create an interrupt handler for the transmit buffer empty interrupt - * (or an equivalent) for your target processor. This function should then - * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that - * a new character can be sent. The protocol stack will then call - * xMBPortSerialPutByte( ) to send the character. - */ -void prvvUARTTxReadyISR(void) -{ - pxMBFrameCBTransmitterEmpty(); -} - -/* - * Create an interrupt handler for the receive interrupt for your target - * processor. This function should then call pxMBFrameCBByteReceived( ). The - * protocol stack will then call xMBPortSerialGetByte( ) to retrieve the - * character. - */ -void prvvUARTRxISR(void) -{ - pxMBFrameCBByteReceived(); -} -/******************************************************************************* - * Function Name : USART1_IRQHandler - * Description : This function handles USART1 global interrupt request. - * Input : None - * Output : None - * Return : None - *******************************************************************************/ -void USART1_IRQHandler(void) -{ - rt_interrupt_enter(); - //�����ж� - if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) - { - USART_ClearITPendingBit(USART1, USART_IT_RXNE); - prvvUARTRxISR(); - } - //�����ж� - if (USART_GetITStatus(USART1, USART_IT_TXE) == SET) - { - prvvUARTTxReadyISR(); - } - rt_interrupt_leave(); -} diff --git a/components/net/freemodbus-v1.6.0/port/portserial_m.c b/components/net/freemodbus-v1.6.0/port/portserial_m.c deleted file mode 100644 index ca76a81963..0000000000 --- a/components/net/freemodbus-v1.6.0/port/portserial_m.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * FreeModbus Libary: STM32 Port - * Copyright (C) 2013 Armink <[email protected]> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: portserial_m.c,v 1.60 2013/08/13 15:07:05 Armink add Master Functions $ - */ - -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" - -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED -/* ----------------------- static functions ---------------------------------*/ -static void prvvUARTTxReadyISR(void); -static void prvvUARTRxISR(void); -/* ----------------------- Start implementation -----------------------------*/ - -void vMBMasterPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable) -{ - if (xRxEnable) - { - MASTER_RS485_RECEIVE_MODE; - USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); - } - else - { - MASTER_RS485_SEND_MODE; - USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); - } - if (xTxEnable) - { - USART_ITConfig(USART2, USART_IT_TXE, ENABLE); - } - else - { - USART_ITConfig(USART2, USART_IT_TXE, DISABLE); - } -} - -void vMBMasterPortClose(void) -{ - USART_ITConfig(USART2, USART_IT_TXE | USART_IT_RXNE, DISABLE); - USART_Cmd(USART2, DISABLE); -} -//Ĭ��һ������ ����2 �����ʿ����� ��ż��������� -BOOL xMBMasterPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, - eMBParity eParity) -{ - GPIO_InitTypeDef GPIO_InitStructure; - USART_InitTypeDef USART_InitStructure; - NVIC_InitTypeDef NVIC_InitStructure; - //======================ʱ�ӳ�ʼ��======================================= - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); - //======================IO��ʼ��======================================= - //USART2_TX - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; - GPIO_Init(GPIOA, &GPIO_InitStructure); - //USART2_RX - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; - GPIO_Init(GPIOA, &GPIO_InitStructure); - //����485���ͺͽ���ģʽ -// TODO ��ʱ��дB13 ��֮����������ʱ���� - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; - GPIO_Init(GPIOB, &GPIO_InitStructure); - //======================���ڳ�ʼ��======================================= - USART_InitStructure.USART_BaudRate = ulBaudRate; - //����У��ģʽ - switch (eParity) - { - case MB_PAR_NONE: //��У�� - USART_InitStructure.USART_Parity = USART_Parity_No; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - break; - case MB_PAR_ODD: //��У�� - USART_InitStructure.USART_Parity = USART_Parity_Odd; - USART_InitStructure.USART_WordLength = USART_WordLength_9b; - break; - case MB_PAR_EVEN: //żУ�� - USART_InitStructure.USART_Parity = USART_Parity_Even; - USART_InitStructure.USART_WordLength = USART_WordLength_9b; - break; - default: - return FALSE; - } - - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_HardwareFlowControl = - USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - if (ucPORT != 2) - return FALSE; - - ENTER_CRITICAL_SECTION(); //��ȫ���ж� - - USART_Init(USART2, &USART_InitStructure); - USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); - USART_Cmd(USART2, ENABLE); - - //=====================�жϳ�ʼ��====================================== - //����NVIC���ȼ�����ΪGroup2��0-3��ռʽ���ȼ���0-3����Ӧʽ���ȼ� - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); - NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - EXIT_CRITICAL_SECTION(); //��ȫ���ж� - - return TRUE; -} - -BOOL xMBMasterPortSerialPutByte(CHAR ucByte) -{ - USART_SendData(USART2, ucByte); - return TRUE; -} - -BOOL xMBMasterPortSerialGetByte(CHAR * pucByte) -{ - *pucByte = USART_ReceiveData(USART2); - return TRUE; -} - -/* - * Create an interrupt handler for the transmit buffer empty interrupt - * (or an equivalent) for your target processor. This function should then - * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that - * a new character can be sent. The protocol stack will then call - * xMBPortSerialPutByte( ) to send the character. - */ -void prvvUARTTxReadyISR(void) -{ - pxMBMasterFrameCBTransmitterEmpty(); -} - -/* - * Create an interrupt handler for the receive interrupt for your target - * processor. This function should then call pxMBFrameCBByteReceived( ). The - * protocol stack will then call xMBPortSerialGetByte( ) to retrieve the - * character. - */ -void prvvUARTRxISR(void) -{ - pxMBMasterFrameCBByteReceived(); -} -/******************************************************************************* - * Function Name : USART2_IRQHandler - * Description : This function handles USART2 global interrupt request. - * Input : None - * Output : None - * Return : None - *******************************************************************************/ -void USART2_IRQHandler(void) -{ - rt_interrupt_enter(); - //�����ж� - if (USART_GetITStatus(USART2, USART_IT_RXNE) == SET) - { - USART_ClearITPendingBit(USART2, USART_IT_RXNE); - prvvUARTRxISR(); - } - //�����ж� - if (USART_GetITStatus(USART2, USART_IT_TXE) == SET) - { - prvvUARTTxReadyISR(); - } - rt_interrupt_leave(); -} - -#endif diff --git a/components/net/freemodbus-v1.6.0/port/porttimer.c b/components/net/freemodbus-v1.6.0/port/porttimer.c deleted file mode 100644 index b7b74ce078..0000000000 --- a/components/net/freemodbus-v1.6.0/port/porttimer.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * FreeModbus Libary: STM32 Port - * Copyright (C) 2013 Armink <[email protected]> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: porttimer.c,v 1.60 2013/08/13 15:07:05 Armink $ - */ - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" - -/* ----------------------- static functions ---------------------------------*/ -static void prvvTIMERExpiredISR(void); - -/* ----------------------- Start implementation -----------------------------*/ -BOOL xMBPortTimersInit(USHORT usTim1Timerout50us) -{ - - uint16_t PrescalerValue = 0; - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - NVIC_InitTypeDef NVIC_InitStructure; - //====================================ʱ�ӳ�ʼ��=========================== - //ʹ�ܶ�ʱ��3ʱ�� - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); - //====================================��ʱ����ʼ��=========================== - //��ʱ��ʱ�������˵�� - //HCLKΪ72MHz��APB1����2��ƵΪ36MHz - //TIM3��ʱ�ӱ�Ƶ��Ϊ72MHz��Ӳ���Զ���Ƶ,�ﵽ��� - //TIM3�ķ�Ƶϵ��Ϊ3599��ʱ���Ƶ��Ϊ72 / (1 + Prescaler) = 20KHz,��Ϊ50us - //TIM������ֵΪusTim1Timerout50u - - PrescalerValue = (uint16_t) (SystemCoreClock / 20000) - 1; - //��ʱ��1��ʼ�� - TIM_TimeBaseStructure.TIM_Period = (uint16_t) usTim1Timerout50us; - TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; - TIM_TimeBaseStructure.TIM_ClockDivision = 0; - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); - //Ԥװ��ʹ�� - TIM_ARRPreloadConfig(TIM3, ENABLE); - //====================================�жϳ�ʼ��=========================== - //����NVIC���ȼ�����ΪGroup2��0-3��ռʽ���ȼ���0-3����Ӧʽ���ȼ� - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); - NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - //�������жϱ�־λ - TIM_ClearITPendingBit(TIM3, TIM_IT_Update); - //��ʱ��3����жϹر� - TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE); - //��ʱ��3���� - TIM_Cmd(TIM3, DISABLE); - return TRUE; -} - -void vMBPortTimersEnable() -{ - TIM_ClearITPendingBit(TIM3, TIM_IT_Update); - TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); - TIM_SetCounter(TIM3, 0); - TIM_Cmd(TIM3, ENABLE); -} - -void vMBPortTimersDisable() -{ - TIM_ClearITPendingBit(TIM3, TIM_IT_Update); - TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE); - TIM_SetCounter(TIM3, 0); - TIM_Cmd(TIM3, DISABLE); -} - -void prvvTIMERExpiredISR(void) -{ - (void) pxMBPortCBTimerExpired(); -} - -void TIM3_IRQHandler(void) -{ - rt_interrupt_enter(); - if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) - { - - TIM_ClearFlag(TIM3, TIM_FLAG_Update); //���жϱ�� - TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //�����ʱ��T3����жϱ�־λ - prvvTIMERExpiredISR(); - } - rt_interrupt_leave(); -} diff --git a/components/net/freemodbus-v1.6.0/port/porttimer_m.c b/components/net/freemodbus-v1.6.0/port/porttimer_m.c deleted file mode 100644 index 1881b47053..0000000000 --- a/components/net/freemodbus-v1.6.0/port/porttimer_m.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * FreeModbus Libary: STM32 Port - * Copyright (C) 2013 Armink <[email protected]> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: porttimer_m.c,v 1.60 2013/08/13 15:07:05 Armink add Master Functions$ - */ - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mb_m.h" -#include "mbport.h" - -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED -/* ----------------------- Variables ----------------------------------------*/ -static USHORT usT35TimeOut50us; -static USHORT usPrescalerValue = 0; - -/* ----------------------- static functions ---------------------------------*/ -static void prvvTIMERExpiredISR(void); - -/* ----------------------- Start implementation -----------------------------*/ -BOOL xMBMasterPortTimersInit(USHORT usTimeOut50us) -{ - NVIC_InitTypeDef NVIC_InitStructure; - //====================================ʱ�ӳ�ʼ��=========================== - //ʹ�ܶ�ʱ��2ʱ�� - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); - //====================================��ʱ����ʼ��=========================== - //��ʱ��ʱ�������˵�� - //HCLKΪ72MHz��APB1����2��ƵΪ36MHz - //TIM2��ʱ�ӱ�Ƶ��Ϊ72MHz��Ӳ���Զ���Ƶ,�ﵽ��� - //TIM2�ķ�Ƶϵ��Ϊ3599��ʱ���Ƶ��Ϊ72 / (1 + Prescaler) = 20KHz,��Ϊ50us - //TIM������ֵΪusTim1Timerout50u - usPrescalerValue = (uint16_t) (SystemCoreClock / 20000) - 1; - //����T35��ʱ������ֵ - usT35TimeOut50us = usTimeOut50us; - - //Ԥװ��ʹ�� - TIM_ARRPreloadConfig(TIM2, ENABLE); - //====================================�жϳ�ʼ��=========================== - //����NVIC���ȼ�����ΪGroup2��0-3��ռʽ���ȼ���0-3����Ӧʽ���ȼ� - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); - NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - //�������жϱ�־λ - TIM_ClearITPendingBit(TIM2, TIM_IT_Update); - //��ʱ��3����жϹر� - TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); - //��ʱ��3���� - TIM_Cmd(TIM2, DISABLE); - return TRUE; -} - -void vMBMasterPortTimersT35Enable() -{ - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - - /* Set current timer mode,don't change it.*/ - vMBMasterSetCurTimerMode(MB_TMODE_T35); - - TIM_TimeBaseStructure.TIM_Prescaler = usPrescalerValue; - TIM_TimeBaseStructure.TIM_ClockDivision = 0; - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseStructure.TIM_Period = (uint16_t) usT35TimeOut50us; - TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); - - TIM_ClearITPendingBit(TIM2, TIM_IT_Update); - TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); - TIM_SetCounter(TIM2, 0); - TIM_Cmd(TIM2, ENABLE); -} - -void vMBMasterPortTimersConvertDelayEnable() -{ - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - - /* Set current timer mode,don't change it.*/ - vMBMasterSetCurTimerMode(MB_TMODE_CONVERT_DELAY); - - TIM_TimeBaseStructure.TIM_Prescaler = usPrescalerValue; - TIM_TimeBaseStructure.TIM_ClockDivision = 0; - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseStructure.TIM_Period = (uint16_t)(MB_MASTER_DELAY_MS_CONVERT * 1000 / 50); - TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); - - TIM_ClearITPendingBit(TIM2, TIM_IT_Update); - TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); - TIM_SetCounter(TIM2, 0); - TIM_Cmd(TIM2, ENABLE); -} - -void vMBMasterPortTimersRespondTimeoutEnable() -{ - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - - /* Set current timer mode,don't change it.*/ - vMBMasterSetCurTimerMode(MB_TMODE_RESPOND_TIMEOUT); - - TIM_TimeBaseStructure.TIM_Prescaler = usPrescalerValue; - TIM_TimeBaseStructure.TIM_ClockDivision = 0; - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseStructure.TIM_Period = (uint16_t)(MB_MASTER_TIMEOUT_MS_RESPOND * 1000 / 50); - TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); - - TIM_ClearITPendingBit(TIM2, TIM_IT_Update); - TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); - TIM_SetCounter(TIM2, 0); - TIM_Cmd(TIM2, ENABLE); -} - -void vMBMasterPortTimersDisable() -{ - TIM_ClearITPendingBit(TIM2, TIM_IT_Update); - TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); - TIM_SetCounter(TIM2, 0); - TIM_Cmd(TIM2, DISABLE); -} - -void prvvTIMERExpiredISR(void) -{ - (void) pxMBMasterPortCBTimerExpired(); -} - -void TIM2_IRQHandler(void) -{ - rt_interrupt_enter(); - if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) - { - - TIM_ClearFlag(TIM2, TIM_FLAG_Update); //���жϱ�� - TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //�����ʱ��TIM2����жϱ�־λ - prvvTIMERExpiredISR(); - } - rt_interrupt_leave(); -} - -#endif diff --git a/components/net/freemodbus-v1.6.0/port/user_mb_app.c b/components/net/freemodbus-v1.6.0/port/user_mb_app.c deleted file mode 100644 index a99615c235..0000000000 --- a/components/net/freemodbus-v1.6.0/port/user_mb_app.c +++ /dev/null @@ -1,349 +0,0 @@ -#include "user_mb_app.h" -/*------------------------Slave mode use these variables----------------------*/ -//Slave mode:DiscreteInputs variables -USHORT usSDiscInStart = S_DISCRETE_INPUT_START; -#if S_DISCRETE_INPUT_NDISCRETES%8 -UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8+1]; -#else -UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8] ; -#endif -//Slave mode:Coils variables -USHORT usSCoilStart = S_COIL_START; -#if S_COIL_NCOILS%8 -UCHAR ucSCoilBuf[S_COIL_NCOILS/8+1] ; -#else -UCHAR ucSCoilBuf[S_COIL_NCOILS/8] ; -#endif -//Slave mode:InputRegister variables -USHORT usSRegInStart = S_REG_INPUT_START; -USHORT usSRegInBuf[S_REG_INPUT_NREGS] ; -//Slave mode:HoldingRegister variables -USHORT usSRegHoldStart = S_REG_HOLDING_START; -USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS] ; -/*-----------------------Master mode use these variables----------------------*/ -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -//Master mode:DiscreteInputs variables -USHORT usMDiscInStart = M_DISCRETE_INPUT_START; -#if M_DISCRETE_INPUT_NDISCRETES%8 -UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8+1]; -#else -UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8]; -#endif -//Master mode:Coils variables -USHORT usMCoilStart = M_COIL_START; -#if M_COIL_NCOILS%8 -UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8+1]; -#else -UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8]; -#endif -//Master mode:InputRegister variables -USHORT usMRegInStart = M_REG_INPUT_START; -USHORT usMRegInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_INPUT_NREGS]; -//Master mode:HoldingRegister variables -USHORT usMRegHoldStart = M_REG_HOLDING_START; -USHORT usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS]; -#endif -//******************************����Ĵ����ص�����********************************** -//��������: eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) -//�� ��������Ĵ�����صĹ��ܣ������������� -//��ڲ�����pucRegBuffer : �ص�������Modbus�Ĵ����ĵ�ǰֵд��Ļ����� -// usAddress : �Ĵ�������ʼ��ַ������Ĵ����ĵ�ַ��Χ��1-65535�� -// usNRegs : �Ĵ������� -//���ڲ�����eMBErrorCode : ������������صĴ����� -//�� ע��Editor��Armink 2010-10-31 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) -{ - eMBErrorCode eStatus = MB_ENOERR; - int iRegIndex; - USHORT * pusRegInputBuf; - UCHAR REG_INPUT_START; - UCHAR REG_INPUT_NREGS; - UCHAR usRegInStart; - - //Determine the master or slave - if (xMBMasterGetCBRunInMasterMode()) - { - pusRegInputBuf = usMRegInBuf[ucMBMasterGetDestAddress()]; - REG_INPUT_START = M_REG_INPUT_START; - REG_INPUT_NREGS = M_REG_INPUT_NREGS; - usRegInStart = usMRegInStart; - } - else - { - pusRegInputBuf = usSRegInBuf; - REG_INPUT_START = S_REG_INPUT_START; - REG_INPUT_NREGS = S_REG_INPUT_NREGS; - usRegInStart = usSRegInStart; - } - - if( ( usAddress >= REG_INPUT_START ) - && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) ) - { - iRegIndex = ( int )( usAddress - usRegInStart ); - while( usNRegs > 0 ) - { - //Determine the master or slave - if (xMBMasterGetCBRunInMasterMode()) - { - pusRegInputBuf[iRegIndex] = *pucRegBuffer++ << 8; - pusRegInputBuf[iRegIndex] |= *pucRegBuffer++; - } - else - { - *pucRegBuffer++ = ( unsigned char )( pusRegInputBuf[iRegIndex] >> 8 ); - *pucRegBuffer++ = ( unsigned char )( pusRegInputBuf[iRegIndex] & 0xFF ); - } - iRegIndex++; - usNRegs--; - } - } - else - { - eStatus = MB_ENOREG; - } - - return eStatus; -} -//******************************���ּĴ����ص�����********************************** -//��������: eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) -//�� �������ּĴ�����صĹ��ܣ�������������д������д�� -//��ڲ�����pucRegBuffer : �����Ҫ�����û��Ĵ�����ֵ���������������ָ���µļĴ�����ֵ�� -// ���Э��ջ��֪����ǰ����ֵ���ص��������뽫��ǰֵд����������� -// usAddress : �Ĵ�������ʼ��ַ�� -// usNRegs : �Ĵ������� -// eMode : ����ò���ΪeMBRegisterMode::MB_REG_WRITE���û���Ӧ����ֵ����pucRegBuffer�еõ����¡� -// ����ò���ΪeMBRegisterMode::MB_REG_READ���û���Ҫ����ǰ��Ӧ�����ݴ洢��pucRegBuffer�� -//���ڲ�����eMBErrorCode : ������������صĴ����� -//�� ע��Editor��Armink 2010-10-31 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) -{ - eMBErrorCode eStatus = MB_ENOERR; - int iRegIndex; - USHORT * pusRegHoldingBuf; - UCHAR REG_HOLDING_START; - UCHAR REG_HOLDING_NREGS; - UCHAR usRegHoldStart; - - //Determine the master or slave - if (xMBMasterGetCBRunInMasterMode()) - { - pusRegHoldingBuf = usMRegHoldBuf[ucMBMasterGetDestAddress()]; - REG_HOLDING_START = M_REG_HOLDING_START; - REG_HOLDING_NREGS = M_REG_HOLDING_NREGS; - usRegHoldStart = usMRegHoldStart; - //If mode is read,the master will wirte the received date to bufffer. - eMode = MB_REG_WRITE; - } - else - { - pusRegHoldingBuf = usSRegHoldBuf; - REG_HOLDING_START = S_REG_HOLDING_START; - REG_HOLDING_NREGS = S_REG_HOLDING_NREGS; - usRegHoldStart = usSRegHoldStart; - } - - if( ( usAddress >= REG_HOLDING_START ) && - ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) ) - { - iRegIndex = ( int )( usAddress - usRegHoldStart ); - switch ( eMode ) - { - /* Pass current register values to the protocol stack. */ - case MB_REG_READ: - while( usNRegs > 0 ) - { - *pucRegBuffer++ = ( unsigned char )( pusRegHoldingBuf[iRegIndex] >> 8 ); - *pucRegBuffer++ = ( unsigned char )( pusRegHoldingBuf[iRegIndex] & 0xFF ); - iRegIndex++; - usNRegs--; - } - break; - - /* Update current register values with new values from the - * protocol stack. */ - case MB_REG_WRITE: - while( usNRegs > 0 ) - { - pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8; - pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++; - iRegIndex++; - usNRegs--; - } - break; - } - } - else - { - eStatus = MB_ENOREG; - } - return eStatus; -} -//****************************��Ȧ״̬�Ĵ����ص�����******************************** -//��������: eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) -//�� ������Ȧ״̬�Ĵ�����صĹ��ܣ�������������д������д�� -//��ڲ�����pucRegBuffer : λ���һ���ֽڣ���ʼ�Ĵ�����Ӧ��λ���ڸ��ֽ�pucRegBuffer�����λLSB�� -// ����ص�����Ҫд�����������û���õ�����Ȧ�����粻��8��һ�����Ȧ״̬����Ӧ��λ����ֵ��������λ0�� -// usAddress : ��һ����Ȧ��ַ�� -// usNCoils : �������Ȧ���� -// eMode ������ò���ΪeMBRegisterMode::MB_REG_WRITE���û���Ӧ����ֵ����pucRegBuffer�еõ����¡� -// ����ò���ΪeMBRegisterMode::MB_REG_READ���û���Ҫ����ǰ��Ӧ�����ݴ洢��pucRegBuffer�� -//���ڲ�����eMBErrorCode : ������������صĴ����� -//�� ע��Editor��Armink 2010-10-31 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) -{ - eMBErrorCode eStatus = MB_ENOERR; - int iRegIndex , iRegBitIndex , iNReg; - UCHAR * pucCoilBuf; - UCHAR COIL_START; - UCHAR COIL_NCOILS; - UCHAR usCoilStart; - iNReg = usNCoils / 8 + 1; //ռ�üĴ������� - - - //Determine the master or slave - if (xMBMasterGetCBRunInMasterMode()) - { - pucCoilBuf = ucMCoilBuf[ucMBMasterGetDestAddress()]; - COIL_START = M_COIL_START; - COIL_NCOILS = M_COIL_NCOILS; - usCoilStart = usMCoilStart; - //If mode is read,the master will wirte the received date to bufffer. - eMode = MB_REG_WRITE; - } - else - { - pucCoilBuf = ucSCoilBuf; - COIL_START = S_COIL_START; - COIL_NCOILS = S_COIL_NCOILS; - usCoilStart = usSCoilStart; - } - - if( ( usAddress >= COIL_START ) && - ( usAddress + usNCoils <= COIL_START + COIL_NCOILS ) ) - { - iRegIndex = ( int )( usAddress - usCoilStart ) / 8 ; //ÿ���Ĵ�����8�� - iRegBitIndex = ( int )( usAddress - usCoilStart ) % 8 ; //����ڼĴ����ڲ���λ��ַ - switch ( eMode ) - { - /* Pass current coil values to the protocol stack. */ - case MB_REG_READ: - while( iNReg > 0 ) - { - *pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++] , iRegBitIndex , 8); - iNReg --; - } - pucRegBuffer --; - usNCoils = usNCoils % 8; //���µ���Ȧ�� - *pucRegBuffer = *pucRegBuffer <<(8 - usNCoils); //��λ���� - *pucRegBuffer = *pucRegBuffer >>(8 - usNCoils); - break; - - /* Update current coil values with new values from the - * protocol stack. */ - case MB_REG_WRITE: - while(iNReg > 1) //��������������������� - { - xMBUtilSetBits(&pucCoilBuf[iRegIndex++] , iRegBitIndex , 8 , *pucRegBuffer++); - iNReg--; - } - usNCoils = usNCoils % 8; //���µ���Ȧ�� - if (usNCoils != 0) //xMBUtilSetBits���� �ڲ���λ����Ϊ0ʱ����bug - { - xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils, - *pucRegBuffer++); - } - break; - } - } - else - { - eStatus = MB_ENOREG; - } - return eStatus; -} -//****************************��ɢ����Ĵ����ص�����******************************** -//��������: eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) -//�� ������ɢ����Ĵ�����صĹ��ܣ������������� -//��ڲ�����pucRegBuffer : �õ�ǰ����Ȧ���ݸ�������Ĵ�������ʼ�Ĵ�����Ӧ��λ���ڸ��ֽ�pucRegBuffer�����λLSB�� -// ����ص�����Ҫд�����������û���õ�����Ȧ�����粻��8��һ�����Ȧ״̬����Ӧ��λ����ֵ��������Ϊ0�� -// usAddress : ��ɢ�������ʼ��ַ -// usNDiscrete : ��ɢ��������� -//���ڲ�����eMBErrorCode : ������������صĴ����� -//�� ע��Editor��Armink 2010-10-31 Company: BXXJS -//********************************************************************************** -eMBErrorCode -eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) -{ - eMBErrorCode eStatus = MB_ENOERR; - int iRegIndex , iRegBitIndex , iNReg; - UCHAR * pucDiscreteInputBuf; - UCHAR DISCRETE_INPUT_START; - UCHAR DISCRETE_INPUT_NDISCRETES; - UCHAR usDiscreteInputStart; - iNReg = usNDiscrete / 8 + 1; //ռ�üĴ������� - - //Determine the master or slave - if (xMBMasterGetCBRunInMasterMode()) - { - pucDiscreteInputBuf = ucMDiscInBuf[ucMBMasterGetDestAddress()]; - DISCRETE_INPUT_START = M_DISCRETE_INPUT_START; - DISCRETE_INPUT_NDISCRETES = M_DISCRETE_INPUT_NDISCRETES; - usDiscreteInputStart = usMDiscInStart; - } - else - { - pucDiscreteInputBuf = ucSDiscInBuf; - DISCRETE_INPUT_START = S_DISCRETE_INPUT_START; - DISCRETE_INPUT_NDISCRETES = S_DISCRETE_INPUT_NDISCRETES; - usDiscreteInputStart = usSDiscInStart; - } - - if( ( usAddress >= DISCRETE_INPUT_START ) - && ( usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES ) ) - { - iRegIndex = ( int )( usAddress - usDiscreteInputStart ) / 8 ; //ÿ���Ĵ�����8�� - iRegBitIndex = ( int )( usAddress - usDiscreteInputStart ) % 8 ; //����ڼĴ����ڲ���λ��ַ - - //Determine the master or slave - if (xMBMasterGetCBRunInMasterMode()) - { - /* Update current coil values with new values from the - * protocol stack. */ - while(iNReg > 1) //��������������������� - { - xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++] , iRegBitIndex , 8 , *pucRegBuffer++); - iNReg--; - } - usNDiscrete = usNDiscrete % 8; //���µ���Ȧ�� - if (usNDiscrete != 0) //xMBUtilSetBits���� �ڲ���λ����Ϊ0ʱ����bug - { - xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++], iRegBitIndex, - usNDiscrete, *pucRegBuffer++); - } - } - else - { - while( iNReg > 0 ) - { - *pucRegBuffer++ = xMBUtilGetBits(&pucDiscreteInputBuf[iRegIndex++] , iRegBitIndex , 8); - iNReg --; - } - pucRegBuffer --; - usNDiscrete = usNDiscrete % 8; //���µ���Ȧ�� - *pucRegBuffer = *pucRegBuffer <<(8 - usNDiscrete); //��λ���� - *pucRegBuffer = *pucRegBuffer >>(8 - usNDiscrete); - } - } - else - { - eStatus = MB_ENOREG; - } - - return eStatus; -} diff --git a/components/net/freemodbus-v1.6.0/port/user_mb_app.h b/components/net/freemodbus-v1.6.0/port/user_mb_app.h deleted file mode 100644 index 440ca82135..0000000000 --- a/components/net/freemodbus-v1.6.0/port/user_mb_app.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef USER_APP -#define USER_APP -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mb_m.h" -#include "mbconfig.h" -#include "mbframe.h" -#include "mbutils.h" - -/* -----------------------Slave Defines -------------------------------------*/ -#define S_DISCRETE_INPUT_START 1 -#define S_DISCRETE_INPUT_NDISCRETES 16 -#define S_COIL_START 1 -#define S_COIL_NCOILS 64 -#define S_REG_INPUT_START 1 -#define S_REG_INPUT_NREGS 100 -#define S_REG_HOLDING_START 1 -#define S_REG_HOLDING_NREGS 100 -//�ӻ�ģʽ���ڱ��ּĴ����У�������ַ��Ӧ�Ĺ��ܶ��� -#define S_HD_RESERVE 0 //���� -#define S_HD_CPU_USAGE_MAJOR 1 //��ǰCPU�����ʵ�����λ -#define S_HD_CPU_USAGE_MINOR 2 //��ǰCPU�����ʵ�С��λ - -//�ӻ�ģʽ��������Ĵ����У�������ַ��Ӧ�Ĺ��ܶ��� -#define S_IN_RESERVE 0 //���� - -//�ӻ�ģʽ������Ȧ�У�������ַ��Ӧ�Ĺ��ܶ��� -#define S_CO_RESERVE 2 //���� - -//�ӻ�ģʽ������ɢ�����У�������ַ��Ӧ�Ĺ��ܶ��� -#define S_DI_RESERVE 1 //���� - -/* -----------------------Master Defines -------------------------------------*/ -#define M_DISCRETE_INPUT_START 1 -#define M_DISCRETE_INPUT_NDISCRETES 16 -#define M_COIL_START 1 -#define M_COIL_NCOILS 64 -#define M_REG_INPUT_START 1 -#define M_REG_INPUT_NREGS 100 -#define M_REG_HOLDING_START 1 -#define M_REG_HOLDING_NREGS 100 -//����ģʽ���ڱ��ּĴ����У�������ַ��Ӧ�Ĺ��ܶ��� -#define M_HD_RESERVE 0 //���� - -//����ģʽ��������Ĵ����У�������ַ��Ӧ�Ĺ��ܶ��� -#define M_IN_RESERVE 0 //���� - -//����ģʽ������Ȧ�У�������ַ��Ӧ�Ĺ��ܶ��� -#define M_CO_RESERVE 2 //���� - -//����ģʽ������ɢ�����У�������ַ��Ӧ�Ĺ��ܶ��� -#define M_DI_RESERVE 1 //���� - -#endif diff --git a/components/net/freemodbus-v1.6.0/Changelog.txt b/components/net/freemodbus/Changelog.txt index 2816ea30f3..2816ea30f3 100644 --- a/components/net/freemodbus-v1.6.0/Changelog.txt +++ b/components/net/freemodbus/Changelog.txt diff --git a/components/net/freemodbus-v1.6.0/SConscript b/components/net/freemodbus/SConscript index 77ab37e086..d613a9f398 100644 --- a/components/net/freemodbus-v1.6.0/SConscript +++ b/components/net/freemodbus/SConscript @@ -7,7 +7,6 @@ modbus/functions/mbutils.c modbus/functions/mbfuncother.c modbus/rtu/mbcrc.c port/port.c -port/user_mb_app.c """) master_rtu_src = Split(""" @@ -20,6 +19,7 @@ modbus/mb_m.c port/portevent_m.c port/portserial_m.c port/porttimer_m.c +port/user_mb_app_m.c """) slave_rtu_src = Split(""" @@ -32,6 +32,7 @@ modbus/mb.c port/portevent.c port/portserial.c port/porttimer.c +port/user_mb_app.c """) master_slave_rtu_src = Split(""" @@ -53,6 +54,8 @@ port/portserial.c port/portserial_m.c port/porttimer.c port/porttimer_m.c +port/user_mb_app.c +port/user_mb_app_m.c """) # The set of source files associated with this SConscript file. diff --git a/components/net/freemodbus-v1.6.0/bsd.txt b/components/net/freemodbus/bsd.txt index 362d3e37c8..362d3e37c8 100644 --- a/components/net/freemodbus-v1.6.0/bsd.txt +++ b/components/net/freemodbus/bsd.txt diff --git a/components/net/freemodbus-v1.6.0/gpl.txt b/components/net/freemodbus/gpl.txt index 3912109b5c..3912109b5c 100644 --- a/components/net/freemodbus-v1.6.0/gpl.txt +++ b/components/net/freemodbus/gpl.txt diff --git a/components/net/freemodbus-v1.6.0/lgpl.txt b/components/net/freemodbus/lgpl.txt index 8add30ad59..8add30ad59 100644 --- a/components/net/freemodbus-v1.6.0/lgpl.txt +++ b/components/net/freemodbus/lgpl.txt diff --git a/components/net/freemodbus-v1.6.0/modbus/ascii/mbascii.c b/components/net/freemodbus/modbus/ascii/mbascii.c index b0f3bc05d2..b0f3bc05d2 100644 --- a/components/net/freemodbus-v1.6.0/modbus/ascii/mbascii.c +++ b/components/net/freemodbus/modbus/ascii/mbascii.c diff --git a/components/net/freemodbus-v1.6.0/modbus/ascii/mbascii.h b/components/net/freemodbus/modbus/ascii/mbascii.h index cdec83ff00..cdec83ff00 100644 --- a/components/net/freemodbus-v1.6.0/modbus/ascii/mbascii.h +++ b/components/net/freemodbus/modbus/ascii/mbascii.h diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbfunccoils.c b/components/net/freemodbus/modbus/functions/mbfunccoils.c index 681bd50656..681bd50656 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbfunccoils.c +++ b/components/net/freemodbus/modbus/functions/mbfunccoils.c diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbfunccoils_m.c b/components/net/freemodbus/modbus/functions/mbfunccoils_m.c index 553f57b1b7..f6bb51cdf6 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbfunccoils_m.c +++ b/components/net/freemodbus/modbus/functions/mbfunccoils_m.c @@ -74,14 +74,24 @@ eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); #if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 #if MB_FUNC_READ_COILS_ENABLED > 0 +/** + * This function will request read coil. + * + * @param ucSndAddr salve address + * @param usCoilAddr coil start address + * @param usNCoils coil total number + * @param lTimeOut timeout (-1 will waiting forever) + * + * @return error code + */ eMBMasterReqErrCode -eMBMasterReqReadCoils( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils ) +eMBMasterReqReadCoils( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils ,LONG lTimeOut ) { UCHAR *ucMBFrame; eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - if ( xMBMasterGetIsBusy() ) eErrStatus = MB_MRE_MASTER_BUSY; - else if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; else { vMBMasterGetPDUSndBuf(&ucMBFrame); @@ -93,6 +103,8 @@ eMBMasterReqReadCoils( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils ) ucMBFrame[MB_PDU_REQ_READ_COILCNT_OFF + 1] = usNCoils; vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); + eErrStatus = eMBMasterWaitRequestFinish( ); + } return eErrStatus; } @@ -108,7 +120,12 @@ eMBMasterFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; - if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) + /* If this request is broadcast, and it's read mode. This request don't need execute. */ + if ( xMBMasterRequestIsBroadcast() ) + { + eStatus = MB_EX_NONE; + } + else if ( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) { vMBMasterGetPDUSndBuf(&ucMBFrame); usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); @@ -136,7 +153,7 @@ eMBMasterFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) ( ucByteCount == pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF] ) ) { /* Make callback to fill the buffer. */ - eRegStatus = eMBRegCoilsCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usCoilCount, MB_REG_READ ); + eRegStatus = eMBMasterRegCoilsCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usCoilCount, MB_REG_READ ); /* If an error occured convert it into a Modbus exception. */ if( eRegStatus != MB_ENOERR ) @@ -161,15 +178,27 @@ eMBMasterFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) #if MB_FUNC_WRITE_COIL_ENABLED > 0 +/** + * This function will request write one coil. + * + * @param ucSndAddr salve address + * @param usCoilAddr coil start address + * @param usCoilData data to be written + * @param lTimeOut timeout (-1 will waiting forever) + * + * @return error code + * + * @see eMBMasterReqWriteMultipleCoils + */ eMBMasterReqErrCode -eMBMasterReqWriteCoil( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData ) +eMBMasterReqWriteCoil( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData, LONG lTimeOut ) { UCHAR *ucMBFrame; eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - if ( xMBMasterGetIsBusy() ) eErrStatus = MB_MRE_MASTER_BUSY; - else if ( usCoilAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + if ( usCoilAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; else if ( ( usCoilData != 0xFF00 ) && ( usCoilData != 0x0000 ) ) eErrStatus = MB_MRE_ILL_ARG; + else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; else { vMBMasterGetPDUSndBuf(&ucMBFrame); @@ -181,6 +210,7 @@ eMBMasterReqWriteCoil( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData ) ucMBFrame[MB_PDU_REQ_WRITE_VALUE_OFF + 1] = usCoilData; vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_SIZE ); ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); + eErrStatus = eMBMasterWaitRequestFinish( ); } return eErrStatus; } @@ -214,7 +244,7 @@ eMBMasterFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ) ucBuf[0] = 0; } eRegStatus = - eMBRegCoilsCB( &ucBuf[0], usRegAddress, 1, MB_REG_WRITE ); + eMBMasterRegCoilsCB( &ucBuf[0], usRegAddress, 1, MB_REG_WRITE ); /* If an error occured convert it into a Modbus exception. */ if( eRegStatus != MB_ENOERR ) @@ -240,18 +270,31 @@ eMBMasterFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ) #if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 +/** + * This function will request write multiple coils. + * + * @param ucSndAddr salve address + * @param usCoilAddr coil start address + * @param usNCoils coil total number + * @param usCoilData data to be written + * @param lTimeOut timeout (-1 will waiting forever) + * + * @return error code + * + * @see eMBMasterReqWriteCoil + */ eMBMasterReqErrCode eMBMasterReqWriteMultipleCoils( UCHAR ucSndAddr, - USHORT usCoilAddr, USHORT usNCoils, UCHAR * pucDataBuffer ) + USHORT usCoilAddr, USHORT usNCoils, UCHAR * pucDataBuffer, LONG lTimeOut) { UCHAR *ucMBFrame; USHORT usRegIndex = 0; UCHAR ucByteCount; eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - if ( xMBMasterGetIsBusy() ) eErrStatus = MB_MRE_MASTER_BUSY; - else if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; else if ( usNCoils > MB_PDU_REQ_WRITE_MUL_COILCNT_MAX ) eErrStatus = MB_MRE_ILL_ARG; + else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; else { vMBMasterGetPDUSndBuf(&ucMBFrame); @@ -277,6 +320,7 @@ eMBMasterReqWriteMultipleCoils( UCHAR ucSndAddr, } vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_MUL_SIZE_MIN + ucByteCount ); ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); + eErrStatus = eMBMasterWaitRequestFinish( ); } return eErrStatus; } @@ -293,7 +337,8 @@ eMBMasterFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ) eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; - if( *usLen == MB_PDU_FUNC_WRITE_MUL_SIZE ) + /* If this request is broadcast, the *usLen is not need check. */ + if( ( *usLen == MB_PDU_FUNC_WRITE_MUL_SIZE ) || xMBMasterRequestIsBroadcast() ) { vMBMasterGetPDUSndBuf(&ucMBFrame); usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); @@ -318,7 +363,7 @@ eMBMasterFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ) if( ( usCoilCnt >= 1 ) && ( ucByteCountVerify == ucByteCount ) ) { eRegStatus = - eMBRegCoilsCB( &ucMBFrame[MB_PDU_REQ_WRITE_MUL_VALUES_OFF], + eMBMasterRegCoilsCB( &ucMBFrame[MB_PDU_REQ_WRITE_MUL_VALUES_OFF], usRegAddress, usCoilCnt, MB_REG_WRITE ); /* If an error occured convert it into a Modbus exception. */ diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncdiag.c b/components/net/freemodbus/modbus/functions/mbfuncdiag.c index d75ffc0f72..d75ffc0f72 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncdiag.c +++ b/components/net/freemodbus/modbus/functions/mbfuncdiag.c diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncdisc.c b/components/net/freemodbus/modbus/functions/mbfuncdisc.c index fb378441b9..fb378441b9 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncdisc.c +++ b/components/net/freemodbus/modbus/functions/mbfuncdisc.c diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncdisc_m.c b/components/net/freemodbus/modbus/functions/mbfuncdisc_m.c index 187872c2a6..6c8d6c4741 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncdisc_m.c +++ b/components/net/freemodbus/modbus/functions/mbfuncdisc_m.c @@ -57,16 +57,26 @@ eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); /* ----------------------- Start implementation -----------------------------*/ #if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -#if MB_FUNC_READ_COILS_ENABLED > 0 +#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 +/** + * This function will request read discrete inputs. + * + * @param ucSndAddr salve address + * @param usDiscreteAddr discrete start address + * @param usNDiscreteIn discrete total number + * @param lTimeOut timeout (-1 will waiting forever) + * + * @return error code + */ eMBMasterReqErrCode -eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT usNDiscreteIn ) +eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT usNDiscreteIn, LONG lTimeOut ) { UCHAR *ucMBFrame; eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - if ( xMBMasterGetIsBusy() ) eErrStatus = MB_MRE_MASTER_BUSY; - else if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; else { vMBMasterGetPDUSndBuf(&ucMBFrame); @@ -78,6 +88,7 @@ eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT u ucMBFrame[MB_PDU_REQ_READ_DISCCNT_OFF + 1] = usNDiscreteIn; vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); + eErrStatus = eMBMasterWaitRequestFinish( ); } return eErrStatus; } @@ -93,7 +104,12 @@ eMBMasterFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ) eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; - if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) + /* If this request is broadcast, and it's read mode. This request don't need execute. */ + if ( xMBMasterRequestIsBroadcast() ) + { + eStatus = MB_EX_NONE; + } + else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) { vMBMasterGetPDUSndBuf(&ucMBFrame); usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); @@ -120,7 +136,7 @@ eMBMasterFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ) if ((usDiscreteCnt >= 1) && ucNBytes == pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF]) { /* Make callback to fill the buffer. */ - eRegStatus = eMBRegDiscreteCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usDiscreteCnt ); + eRegStatus = eMBMasterRegDiscreteCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usDiscreteCnt ); /* If an error occured convert it into a Modbus exception. */ if( eRegStatus != MB_ENOERR ) diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncholding.c b/components/net/freemodbus/modbus/functions/mbfuncholding.c index e74a0624dc..e74a0624dc 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncholding.c +++ b/components/net/freemodbus/modbus/functions/mbfuncholding.c diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncholding_m.c b/components/net/freemodbus/modbus/functions/mbfuncholding_m.c index faefbbbb40..e1fe69e383 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncholding_m.c +++ b/components/net/freemodbus/modbus/functions/mbfuncholding_m.c @@ -86,14 +86,24 @@ eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); #if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 #if MB_FUNC_WRITE_HOLDING_ENABLED > 0 +/** + * This function will request write holding register. + * + * @param ucSndAddr salve address + * @param usRegAddr register start address + * @param usRegData register data to be written + * @param lTimeOut timeout (-1 will waiting forever) + * + * @return error code + */ eMBMasterReqErrCode -eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData ) +eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData, LONG lTimeOut ) { UCHAR *ucMBFrame; eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - if ( xMBMasterGetIsBusy() ) eErrStatus = MB_MRE_MASTER_BUSY; - else if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; else { vMBMasterGetPDUSndBuf(&ucMBFrame); @@ -105,6 +115,7 @@ eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRe ucMBFrame[MB_PDU_REQ_WRITE_VALUE_OFF + 1] = usRegData ; vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_SIZE ); ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); + eErrStatus = eMBMasterWaitRequestFinish( ); } return eErrStatus; } @@ -123,7 +134,7 @@ eMBMasterFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) usRegAddress++; /* Make callback to update the value. */ - eRegStatus = eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF], + eRegStatus = eMBMasterRegHoldingCB( &pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF], usRegAddress, 1, MB_REG_WRITE ); /* If an error occured convert it into a Modbus exception. */ @@ -143,16 +154,27 @@ eMBMasterFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) #if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 +/** + * This function will request write multiple holding register. + * + * @param ucSndAddr salve address + * @param usRegAddr register start address + * @param usNRegs register total number + * @param pusDataBuffer data to be written + * @param lTimeOut timeout (-1 will waiting forever) + * + * @return error code + */ eMBMasterReqErrCode eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr, - USHORT usRegAddr, USHORT usNRegs, USHORT * pusDataBuffer ) + USHORT usRegAddr, USHORT usNRegs, USHORT * pusDataBuffer, LONG lTimeOut ) { UCHAR *ucMBFrame; USHORT usRegIndex = 0; eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - if ( xMBMasterGetIsBusy() ) eErrStatus = MB_MRE_MASTER_BUSY; - else if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; else { vMBMasterGetPDUSndBuf(&ucMBFrame); @@ -171,6 +193,7 @@ eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr, } vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_MUL_SIZE_MIN + 2*usNRegs ); ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); + eErrStatus = eMBMasterWaitRequestFinish( ); } return eErrStatus; } @@ -186,7 +209,8 @@ eMBMasterFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; - if( *usLen == MB_PDU_SIZE_MIN + MB_PDU_FUNC_WRITE_MUL_SIZE ) + /* If this request is broadcast, the *usLen is not need check. */ + if( ( *usLen == MB_PDU_SIZE_MIN + MB_PDU_FUNC_WRITE_MUL_SIZE ) || xMBMasterRequestIsBroadcast() ) { vMBMasterGetPDUSndBuf(&ucMBFrame); usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF] << 8 ); @@ -202,7 +226,7 @@ eMBMasterFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) { /* Make callback to update the register values. */ eRegStatus = - eMBRegHoldingCB( &ucMBFrame[MB_PDU_REQ_WRITE_MUL_VALUES_OFF], + eMBMasterRegHoldingCB( &ucMBFrame[MB_PDU_REQ_WRITE_MUL_VALUES_OFF], usRegAddress, usRegCount, MB_REG_WRITE ); /* If an error occured convert it into a Modbus exception. */ @@ -227,14 +251,24 @@ eMBMasterFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) #if MB_FUNC_READ_HOLDING_ENABLED > 0 +/** + * This function will request read holding register. + * + * @param ucSndAddr salve address + * @param usRegAddr register start address + * @param usNRegs register total number + * @param lTimeOut timeout (-1 will waiting forever) + * + * @return error code + */ eMBMasterReqErrCode -eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs ) +eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ) { UCHAR *ucMBFrame; eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - if ( xMBMasterGetIsBusy() ) eErrStatus = MB_MRE_MASTER_BUSY; - else if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; else { vMBMasterGetPDUSndBuf(&ucMBFrame); @@ -246,6 +280,7 @@ eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRe ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] = usNRegs; vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); + eErrStatus = eMBMasterWaitRequestFinish( ); } return eErrStatus; } @@ -260,7 +295,12 @@ eMBMasterFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; - if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) + /* If this request is broadcast, and it's read mode. This request don't need execute. */ + if ( xMBMasterRequestIsBroadcast() ) + { + eStatus = MB_EX_NONE; + } + else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) { vMBMasterGetPDUSndBuf(&ucMBFrame); usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); @@ -268,7 +308,7 @@ eMBMasterFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) usRegAddress++; usRegCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF] << 8 ); - usRegCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] ); + usRegCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] ); /* Check if the number of registers to read is valid. If not * return Modbus illegal data value exception. @@ -276,7 +316,7 @@ eMBMasterFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) if( ( usRegCount >= 1 ) && ( 2 * usRegCount == pucFrame[MB_PDU_FUNC_READ_BYTECNT_OFF] ) ) { /* Make callback to fill the buffer. */ - eRegStatus = eMBRegHoldingCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usRegCount, MB_REG_READ ); + eRegStatus = eMBMasterRegHoldingCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usRegCount, MB_REG_READ ); /* If an error occured convert it into a Modbus exception. */ if( eRegStatus != MB_ENOERR ) { @@ -300,17 +340,30 @@ eMBMasterFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) #if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 +/** + * This function will request read and write holding register. + * + * @param ucSndAddr salve address + * @param usReadRegAddr read register start address + * @param usNReadRegs read register total number + * @param pusDataBuffer data to be written + * @param usWriteRegAddr write register start address + * @param usNWriteRegs write register total number + * @param lTimeOut timeout (-1 will waiting forever) + * + * @return error code + */ eMBMasterReqErrCode eMBMasterReqReadWriteMultipleHoldingRegister( UCHAR ucSndAddr, USHORT usReadRegAddr, USHORT usNReadRegs, USHORT * pusDataBuffer, - USHORT usWriteRegAddr, USHORT usNWriteRegs ) + USHORT usWriteRegAddr, USHORT usNWriteRegs, LONG lTimeOut ) { UCHAR *ucMBFrame; USHORT usRegIndex = 0; eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - if ( xMBMasterGetIsBusy() ) eErrStatus = MB_MRE_MASTER_BUSY; - else if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; else { vMBMasterGetPDUSndBuf(&ucMBFrame); @@ -333,6 +386,7 @@ eMBMasterReqReadWriteMultipleHoldingRegister( UCHAR ucSndAddr, } vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READWRITE_SIZE_MIN + 2*usNWriteRegs ); ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); + eErrStatus = eMBMasterWaitRequestFinish( ); } return eErrStatus; } @@ -349,7 +403,12 @@ eMBMasterFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; - if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READWRITE_SIZE_MIN) + /* If this request is broadcast, and it's read mode. This request don't need execute. */ + if ( xMBMasterRequestIsBroadcast() ) + { + eStatus = MB_EX_NONE; + } + else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READWRITE_SIZE_MIN ) { vMBMasterGetPDUSndBuf(&ucMBFrame); usRegReadAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF] << 8U ); @@ -369,13 +428,13 @@ eMBMasterFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen if( ( 2 * usRegReadCount ) == pucFrame[MB_PDU_FUNC_READWRITE_READ_BYTECNT_OFF] ) { /* Make callback to update the register values. */ - eRegStatus = eMBRegHoldingCB( &ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF], + eRegStatus = eMBMasterRegHoldingCB( &ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF], usRegWriteAddress, usRegWriteCount, MB_REG_WRITE ); if( eRegStatus == MB_ENOERR ) { /* Make the read callback. */ - eRegStatus = eMBRegHoldingCB(&pucFrame[MB_PDU_FUNC_READWRITE_READ_VALUES_OFF], + eRegStatus = eMBMasterRegHoldingCB(&pucFrame[MB_PDU_FUNC_READWRITE_READ_VALUES_OFF], usRegReadAddress, usRegReadCount, MB_REG_READ); } if( eRegStatus != MB_ENOERR ) diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncinput.c b/components/net/freemodbus/modbus/functions/mbfuncinput.c index cceedbafea..cceedbafea 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncinput.c +++ b/components/net/freemodbus/modbus/functions/mbfuncinput.c diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncinput_m.c b/components/net/freemodbus/modbus/functions/mbfuncinput_m.c index e5f362bbec..2127efef67 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncinput_m.c +++ b/components/net/freemodbus/modbus/functions/mbfuncinput_m.c @@ -59,14 +59,24 @@ eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); #if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 #if MB_FUNC_READ_INPUT_ENABLED > 0 +/** + * This function will request read input register. + * + * @param ucSndAddr salve address + * @param usRegAddr register start address + * @param usNRegs register total number + * @param lTimeOut timeout (-1 will waiting forever) + * + * @return error code + */ eMBMasterReqErrCode -eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs ) +eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ) { UCHAR *ucMBFrame; eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - if ( xMBMasterGetIsBusy() ) eErrStatus = MB_MRE_MASTER_BUSY; - else if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; + else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; else { vMBMasterGetPDUSndBuf(&ucMBFrame); @@ -78,6 +88,7 @@ eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] = usNRegs; vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); + eErrStatus = eMBMasterWaitRequestFinish( ); } return eErrStatus; } @@ -92,7 +103,12 @@ eMBMasterFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ) eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; - if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN) + /* If this request is broadcast, and it's read mode. This request don't need execute. */ + if ( xMBMasterRequestIsBroadcast() ) + { + eStatus = MB_EX_NONE; + } + else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) { vMBMasterGetPDUSndBuf(&ucMBFrame); usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); @@ -100,7 +116,7 @@ eMBMasterFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ) usRegAddress++; usRegCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF] << 8 ); - usRegCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] ); + usRegCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] ); /* Check if the number of registers to read is valid. If not * return Modbus illegal data value exception. @@ -108,7 +124,7 @@ eMBMasterFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ) if( ( usRegCount >= 1 ) && ( 2 * usRegCount == pucFrame[MB_PDU_FUNC_READ_BYTECNT_OFF] ) ) { /* Make callback to fill the buffer. */ - eRegStatus = eMBRegInputCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usRegCount ); + eRegStatus = eMBMasterRegInputCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usRegCount ); /* If an error occured convert it into a Modbus exception. */ if( eRegStatus != MB_ENOERR ) { diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncother.c b/components/net/freemodbus/modbus/functions/mbfuncother.c index fcee972bf8..fcee972bf8 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbfuncother.c +++ b/components/net/freemodbus/modbus/functions/mbfuncother.c diff --git a/components/net/freemodbus-v1.6.0/modbus/functions/mbutils.c b/components/net/freemodbus/modbus/functions/mbutils.c index 4ffbd3e001..4ffbd3e001 100644 --- a/components/net/freemodbus-v1.6.0/modbus/functions/mbutils.c +++ b/components/net/freemodbus/modbus/functions/mbutils.c diff --git a/components/net/freemodbus-v1.6.0/modbus/include/mb.h b/components/net/freemodbus/modbus/include/mb.h index 8d6be7b422..8d6be7b422 100644 --- a/components/net/freemodbus-v1.6.0/modbus/include/mb.h +++ b/components/net/freemodbus/modbus/include/mb.h diff --git a/components/net/freemodbus-v1.6.0/modbus/include/mb_m.h b/components/net/freemodbus/modbus/include/mb_m.h index 9c4fa43e60..f6b25e2cf3 100644 --- a/components/net/freemodbus-v1.6.0/modbus/include/mb_m.h +++ b/components/net/freemodbus/modbus/include/mb_m.h @@ -77,13 +77,10 @@ typedef enum MB_MRE_NO_ERR, /*!< no error. */ MB_MRE_NO_REG, /*!< illegal register address. */ MB_MRE_ILL_ARG, /*!< illegal argument. */ - MB_MRE_PORT_ERR, /*!< porting layer error. */ - MB_MRE_NO_RES, /*!< insufficient resources. */ - MB_MRE_IO, /*!< I/O error. */ - MB_MRE_ILL_STATE, /*!< protocol stack in illegal state. */ + MB_MRE_REV_DATA, /*!< receive data error. */ MB_MRE_TIMEDOUT, /*!< timeout error occurred. */ MB_MRE_MASTER_BUSY, /*!< master is busy now. */ - MB_MRE_SLAVE_EXCE /*!< slave has exception. */ + MB_MRE_EXE_FUN /*!< execute function error. */ } eMBMasterReqErrCode; /*! \ingroup modbus * \brief TimerMode is Master 3 kind of Timer modes. @@ -189,31 +186,176 @@ eMBErrorCode eMBMasterDisable( void ); */ eMBErrorCode eMBMasterPoll( void ); +/*! \ingroup modbus + * \brief Registers a callback handler for a given function code. + * + * This function registers a new callback handler for a given function code. + * The callback handler supplied is responsible for interpreting the Modbus PDU and + * the creation of an appropriate response. In case of an error it should return + * one of the possible Modbus exceptions which results in a Modbus exception frame + * sent by the protocol stack. + * + * \param ucFunctionCode The Modbus function code for which this handler should + * be registers. Valid function codes are in the range 1 to 127. + * \param pxHandler The function handler which should be called in case + * such a frame is received. If \c NULL a previously registered function handler + * for this function code is removed. + * + * \return eMBErrorCode::MB_ENOERR if the handler has been installed. If no + * more resources are available it returns eMBErrorCode::MB_ENORES. In this + * case the values in mbconfig.h should be adjusted. If the argument was not + * valid it returns eMBErrorCode::MB_EINVAL. + */ +eMBErrorCode eMBMasterRegisterCB( UCHAR ucFunctionCode, + pxMBFunctionHandler pxHandler ); + +/* ----------------------- Callback -----------------------------------------*/ + +/*! \defgroup modbus_master registers Modbus Registers + * \code #include "mb_m.h" \endcode + * The protocol stack does not internally allocate any memory for the + * registers. This makes the protocol stack very small and also usable on + * low end targets. In addition the values don't have to be in the memory + * and could for example be stored in a flash.<br> + * Whenever the protocol stack requires a value it calls one of the callback + * function with the register address and the number of registers to read + * as an argument. The application should then read the actual register values + * (for example the ADC voltage) and should store the result in the supplied + * buffer.<br> + * If the protocol stack wants to update a register value because a write + * register function was received a buffer with the new register values is + * passed to the callback function. The function should then use these values + * to update the application register values. + */ + +/*! \ingroup modbus_registers + * \brief Callback function used if the value of a <em>Input Register</em> + * is required by the protocol stack. The starting register address is given + * by \c usAddress and the last register is given by <tt>usAddress + + * usNRegs - 1</tt>. + * + * \param pucRegBuffer A buffer where the callback function should write + * the current value of the modbus registers to. + * \param usAddress The starting address of the register. Input registers + * are in the range 1 - 65535. + * \param usNRegs Number of registers the callback function must supply. + * + * \return The function must return one of the following error codes: + * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal + * Modbus response is sent. + * - eMBErrorCode::MB_ENOREG If the application does not map an coils + * within the requested address range. In this case a + * <b>ILLEGAL DATA ADDRESS</b> is sent as a response. + */ +eMBErrorCode eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNRegs ); + +/*! \ingroup modbus_registers + * \brief Callback function used if a <em>Holding Register</em> value is + * read or written by the protocol stack. The starting register address + * is given by \c usAddress and the last register is given by + * <tt>usAddress + usNRegs - 1</tt>. + * + * \param pucRegBuffer If the application registers values should be updated the + * buffer points to the new registers values. If the protocol stack needs + * to now the current values the callback function should write them into + * this buffer. + * \param usAddress The starting address of the register. + * \param usNRegs Number of registers to read or write. + * \param eMode If eMBRegisterMode::MB_REG_WRITE the application register + * values should be updated from the values in the buffer. For example + * this would be the case when the Modbus master has issued an + * <b>WRITE SINGLE REGISTER</b> command. + * If the value eMBRegisterMode::MB_REG_READ the application should copy + * the current values into the buffer \c pucRegBuffer. + * + * \return The function must return one of the following error codes: + * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal + * Modbus response is sent. + * - eMBErrorCode::MB_ENOREG If the application does not map an coils + * within the requested address range. In this case a + * <b>ILLEGAL DATA ADDRESS</b> is sent as a response. + */ +eMBErrorCode eMBMasterRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNRegs, eMBRegisterMode eMode ); + +/*! \ingroup modbus_registers + * \brief Callback function used if a <em>Coil Register</em> value is + * read or written by the protocol stack. If you are going to use + * this function you might use the functions xMBUtilSetBits( ) and + * xMBUtilGetBits( ) for working with bitfields. + * + * \param pucRegBuffer The bits are packed in bytes where the first coil + * starting at address \c usAddress is stored in the LSB of the + * first byte in the buffer <code>pucRegBuffer</code>. + * If the buffer should be written by the callback function unused + * coil values (I.e. if not a multiple of eight coils is used) should be set + * to zero. + * \param usAddress The first coil number. + * \param usNCoils Number of coil values requested. + * \param eMode If eMBRegisterMode::MB_REG_WRITE the application values should + * be updated from the values supplied in the buffer \c pucRegBuffer. + * If eMBRegisterMode::MB_REG_READ the application should store the current + * values in the buffer \c pucRegBuffer. + * + * \return The function must return one of the following error codes: + * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal + * Modbus response is sent. + * - eMBErrorCode::MB_ENOREG If the application does not map an coils + * within the requested address range. In this case a + * <b>ILLEGAL DATA ADDRESS</b> is sent as a response. + */ +eMBErrorCode eMBMasterRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNCoils, eMBRegisterMode eMode ); + +/*! \ingroup modbus_registers + * \brief Callback function used if a <em>Input Discrete Register</em> value is + * read by the protocol stack. + * + * If you are going to use his function you might use the functions + * xMBUtilSetBits( ) and xMBUtilGetBits( ) for working with bitfields. + * + * \param pucRegBuffer The buffer should be updated with the current + * coil values. The first discrete input starting at \c usAddress must be + * stored at the LSB of the first byte in the buffer. If the requested number + * is not a multiple of eight the remaining bits should be set to zero. + * \param usAddress The starting address of the first discrete input. + * \param usNDiscrete Number of discrete input values. + * \return The function must return one of the following error codes: + * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal + * Modbus response is sent. + * - eMBErrorCode::MB_ENOREG If the application does not map an coils + * within the requested address range. In this case a + * <b>ILLEGAL DATA ADDRESS</b> is sent as a response. + */ +eMBErrorCode eMBMasterRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNDiscrete ); /*! \ingroup modbus *\brief These Modbus functions are called for user when Modbus run in Master Mode. */ eMBMasterReqErrCode -eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs ); +eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ); eMBMasterReqErrCode -eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData ); +eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData, LONG lTimeOut ); eMBMasterReqErrCode -eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, USHORT * pusDataBuffer ); +eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, + USHORT usNRegs, USHORT * pusDataBuffer, LONG lTimeOut ); eMBMasterReqErrCode -eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs ); +eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ); eMBMasterReqErrCode eMBMasterReqReadWriteMultipleHoldingRegister( UCHAR ucSndAddr, USHORT usReadRegAddr, USHORT usNReadRegs, USHORT * pusDataBuffer, - USHORT usWriteRegAddr, USHORT usNWriteRegs ); + USHORT usWriteRegAddr, USHORT usNWriteRegs, LONG lTimeOut ); eMBMasterReqErrCode -eMBMasterReqReadCoils( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils ); +eMBMasterReqReadCoils( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils, LONG lTimeOut ); eMBMasterReqErrCode -eMBMasterReqWriteCoil( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData ); +eMBMasterReqWriteCoil( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData, LONG lTimeOut ); eMBMasterReqErrCode eMBMasterReqWriteMultipleCoils( UCHAR ucSndAddr, - USHORT usCoilAddr, USHORT usNCoils, UCHAR * pucDataBuffer ); + USHORT usCoilAddr, USHORT usNCoils, UCHAR * pucDataBuffer, LONG lTimeOut ); eMBMasterReqErrCode -eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT usNDiscreteIn ); +eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT usNDiscreteIn, LONG lTimeOut ); eMBException eMBMasterFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ); @@ -239,16 +381,18 @@ eMBMasterFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen /*�� \ingroup modbus *\brief These functions are interface for Modbus Master */ -BOOL xMBMasterGetIsBusy( void ); void vMBMasterGetPDUSndBuf( UCHAR ** pucFrame ); UCHAR ucMBMasterGetDestAddress( void ); void vMBMasterSetDestAddress( UCHAR Address ); -void vMBMasterSetIsBusy( BOOL IsBusy ); BOOL xMBMasterGetCBRunInMasterMode( void ); void vMBMasterSetCBRunInMasterMode( BOOL IsMasterMode ); -UCHAR ucMBMasterGetPDUSndLength( void ); -void vMBMasterSetPDUSndLength( UCHAR SendPDULength ); +USHORT usMBMasterGetPDUSndLength( void ); +void vMBMasterSetPDUSndLength( USHORT SendPDULength ); void vMBMasterSetCurTimerMode( eMBMasterTimerMode eMBTimerMode ); +BOOL xMBMasterRequestIsBroadcast( void ); +eMBMasterErrorEventType eMBMasterGetErrorType( void ); +void vMBMasterSetErrorType( eMBMasterErrorEventType errorType ); +eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ); /* ----------------------- Callback -----------------------------------------*/ diff --git a/components/net/freemodbus-v1.6.0/modbus/include/mbconfig.h b/components/net/freemodbus/modbus/include/mbconfig.h index c5434de47e..89030b7abd 100644 --- a/components/net/freemodbus-v1.6.0/modbus/include/mbconfig.h +++ b/components/net/freemodbus/modbus/include/mbconfig.h @@ -115,9 +115,9 @@ PR_BEGIN_EXTERN_C /*! \brief If master send a frame which is not broadcast,the master will wait sometime for slave. * And if slave is not respond in this time,the master will process this timeout error. * Then master can send other frame */ -#define MB_MASTER_TIMEOUT_MS_RESPOND (2000) -/*! \brief The total slaves in Modbus Master system.Default 16. - * Note : The slave ID must be continuous from 0.*/ +#define MB_MASTER_TIMEOUT_MS_RESPOND (100 ) +/*! \brief The total slaves in Modbus Master system. Default 16. + * \note : The slave ID must be continuous from 1.*/ #define MB_MASTER_TOTAL_SLAVE_NUM ( 16 ) #endif diff --git a/components/net/freemodbus-v1.6.0/modbus/include/mbframe.h b/components/net/freemodbus/modbus/include/mbframe.h index 99d59c613e..99d59c613e 100644 --- a/components/net/freemodbus-v1.6.0/modbus/include/mbframe.h +++ b/components/net/freemodbus/modbus/include/mbframe.h diff --git a/components/net/freemodbus-v1.6.0/modbus/include/mbfunc.h b/components/net/freemodbus/modbus/include/mbfunc.h index 3f9c2725a1..3f9c2725a1 100644 --- a/components/net/freemodbus-v1.6.0/modbus/include/mbfunc.h +++ b/components/net/freemodbus/modbus/include/mbfunc.h diff --git a/components/net/freemodbus-v1.6.0/modbus/include/mbport.h b/components/net/freemodbus/modbus/include/mbport.h index a4c0a24dd4..11794a2929 100644 --- a/components/net/freemodbus-v1.6.0/modbus/include/mbport.h +++ b/components/net/freemodbus/modbus/include/mbport.h @@ -36,25 +36,38 @@ PR_BEGIN_EXTERN_C #endif +/* ----------------------- Defines ------------------------------------------*/ + /* ----------------------- Type definitions ---------------------------------*/ typedef enum { - EV_READY, /*!< Startup finished. */ - EV_FRAME_RECEIVED, /*!< Frame received. */ - EV_EXECUTE, /*!< Execute function. */ - EV_FRAME_SENT /*!< Frame sent. */ + EV_READY = 1<<0, /*!< Startup finished. */ + EV_FRAME_RECEIVED = 1<<1, /*!< Frame received. */ + EV_EXECUTE = 1<<2, /*!< Execute function. */ + EV_FRAME_SENT = 1<<3 /*!< Frame sent. */ } eMBEventType; typedef enum { - EV_MASTER_READY, /*!< Startup finished. */ - EV_MASTER_FRAME_RECEIVED, /*!< Frame received. */ - EV_MASTER_EXECUTE, /*!< Execute function. */ - EV_MASTER_FRAME_SENT, /*!< Frame sent. */ - EV_MASTER_ERROR_PROCESS /*!< Frame error process*/ + EV_MASTER_READY = 1<<0, /*!< Startup finished. */ + EV_MASTER_FRAME_RECEIVED = 1<<1, /*!< Frame received. */ + EV_MASTER_EXECUTE = 1<<2, /*!< Execute function. */ + EV_MASTER_FRAME_SENT = 1<<3, /*!< Frame sent. */ + EV_MASTER_ERROR_PROCESS = 1<<4, /*!< Frame error process. */ + EV_MASTER_PROCESS_SUCESS = 1<<5, /*!< Request process success. */ + EV_MASTER_ERROR_RESPOND_TIMEOUT = 1<<6, /*!< Request respond timeout. */ + EV_MASTER_ERROR_RECEIVE_DATA = 1<<7, /*!< Request receive data error. */ + EV_MASTER_ERROR_EXECUTE_FUNCTION = 1<<8, /*!< Request execute function error. */ } eMBMasterEventType; +typedef enum +{ + EV_ERROR_RESPOND_TIMEOUT, /*!< Slave respond timeout. */ + EV_ERROR_RECEIVE_DATA, /*!< Receive frame data erroe. */ + EV_ERROR_EXECUTE_FUNCTION, /*!< Execute function error. */ +} eMBMasterErrorEventType; + /*! \ingroup modbus * \brief Parity used for characters in serial mode. * @@ -82,6 +95,12 @@ BOOL xMBMasterPortEventPost( eMBMasterEventType eEvent ); BOOL xMBMasterPortEventGet( /*@out@ */ eMBMasterEventType * eEvent ); +void vMBMasterOsResInit( void ); + +BOOL xMBMasterRunResTake( int32_t time ); + +void vMBMasterRunResRelease( void ); + /* ----------------------- Serial port functions ----------------------------*/ BOOL xMBPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, @@ -97,7 +116,6 @@ INLINE BOOL xMBPortSerialGetByte( CHAR * pucByte ); INLINE BOOL xMBPortSerialPutByte( CHAR ucByte ); - BOOL xMBMasterPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity ); @@ -132,6 +150,18 @@ INLINE void vMBMasterPortTimersRespondTimeoutEnable( void ); INLINE void vMBMasterPortTimersDisable( void ); +/* ----------------- Callback for the master error process ------------------*/ +void vMBMasterErrorCBRespondTimeout( UCHAR ucDestAddress, const UCHAR* pucPDUData, + USHORT ucPDULength ); + +void vMBMasterErrorCBReceiveData( UCHAR ucDestAddress, const UCHAR* pucPDUData, + USHORT ucPDULength ); + +void vMBMasterErrorCBExecuteFunction( UCHAR ucDestAddress, const UCHAR* pucPDUData, + USHORT ucPDULength ); + +void vMBMasterCBRequestScuuess( void ); + /* ----------------------- Callback for the protocol stack ------------------*/ /*! diff --git a/components/net/freemodbus-v1.6.0/modbus/include/mbproto.h b/components/net/freemodbus/modbus/include/mbproto.h index 786aaf4030..786aaf4030 100644 --- a/components/net/freemodbus-v1.6.0/modbus/include/mbproto.h +++ b/components/net/freemodbus/modbus/include/mbproto.h diff --git a/components/net/freemodbus-v1.6.0/modbus/include/mbutils.h b/components/net/freemodbus/modbus/include/mbutils.h index 61495751d4..61495751d4 100644 --- a/components/net/freemodbus-v1.6.0/modbus/include/mbutils.h +++ b/components/net/freemodbus/modbus/include/mbutils.h diff --git a/components/net/freemodbus-v1.6.0/modbus/mb.c b/components/net/freemodbus/modbus/mb.c index 96d693c910..96d693c910 100644 --- a/components/net/freemodbus-v1.6.0/modbus/mb.c +++ b/components/net/freemodbus/modbus/mb.c diff --git a/components/net/freemodbus-v1.6.0/modbus/mb_m.c b/components/net/freemodbus/modbus/mb_m.c index 8f86f54182..4e7c4b2b74 100644 --- a/components/net/freemodbus-v1.6.0/modbus/mb_m.c +++ b/components/net/freemodbus/modbus/mb_m.c @@ -65,7 +65,7 @@ static UCHAR ucMBMasterDestAddress; static BOOL xMBRunInMasterMode = FALSE; -static BOOL xMasterIsBusy = FALSE; +static eMBMasterErrorEventType eMBMasterCurErrorType; static enum { @@ -185,6 +185,8 @@ eMBMasterInit( eMBMode eMode, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity { eMBState = STATE_DISABLED; } + /* initialize the OS resource for modbus master. */ + vMBMasterOsResInit(); } return eStatus; } @@ -257,9 +259,10 @@ eMBMasterPoll( void ) static USHORT usLength; static eMBException eException; - int i; + int i , j; eMBErrorCode eStatus = MB_ENOERR; eMBMasterEventType eEvent; + eMBMasterErrorEventType errorType; /* Check if the protocol stack is ready. */ if( eMBState != STATE_ENABLED ) @@ -285,6 +288,7 @@ eMBMasterPoll( void ) } else { + vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); } break; @@ -292,52 +296,80 @@ eMBMasterPoll( void ) case EV_MASTER_EXECUTE: ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF]; eException = MB_EX_ILLEGAL_FUNCTION; - for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - /* No more function handlers registered. Abort. */ - if( xMasterFuncHandlers[i].ucFunctionCode == 0 ) - { - break; - } - else if( xMasterFuncHandlers[i].ucFunctionCode == ucFunctionCode ) - { - vMBMasterSetCBRunInMasterMode(TRUE); - eException = xMasterFuncHandlers[i].pxHandler( ucMBFrame, &usLength ); - vMBMasterSetCBRunInMasterMode(FALSE); - break; - } - } /* If receive frame has exception .The receive function code highest bit is 1.*/ - if(ucFunctionCode >> 7) eException = (eMBException)ucMBFrame[MB_PDU_DATA_OFF]; + if(ucFunctionCode >> 7) { + eException = (eMBException)ucMBFrame[MB_PDU_DATA_OFF]; + } + else + { + for (i = 0; i < MB_FUNC_HANDLERS_MAX; i++) + { + /* No more function handlers registered. Abort. */ + if (xMasterFuncHandlers[i].ucFunctionCode == 0) { + break; + } + else if (xMasterFuncHandlers[i].ucFunctionCode == ucFunctionCode) { + vMBMasterSetCBRunInMasterMode(TRUE); + /* If master request is broadcast, + * the master need execute function for all slave. + */ + if ( xMBMasterRequestIsBroadcast() ) { + usLength = usMBMasterGetPDUSndLength(); + for(j = 1; j <= MB_MASTER_TOTAL_SLAVE_NUM; j++){ + vMBMasterSetDestAddress(j); + eException = xMasterFuncHandlers[i].pxHandler(ucMBFrame, &usLength); + } + } + else { + eException = xMasterFuncHandlers[i].pxHandler(ucMBFrame, &usLength); + } + vMBMasterSetCBRunInMasterMode(FALSE); + break; + } + } + } /* If master has exception ,Master will send error process.Otherwise the Master is idle.*/ - if (eException != MB_EX_NONE) ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); - else vMBMasterSetIsBusy( FALSE ); + if (eException != MB_EX_NONE) { + vMBMasterSetErrorType(EV_ERROR_EXECUTE_FUNCTION); + ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); + } + else { + vMBMasterCBRequestScuuess( ); + vMBMasterRunResRelease( ); + } break; case EV_MASTER_FRAME_SENT: /* Master is busy now. */ - vMBMasterSetIsBusy( TRUE ); vMBMasterGetPDUSndBuf( &ucMBFrame ); - eStatus = peMBMasterFrameSendCur( ucMBMasterGetDestAddress(), ucMBFrame, ucMBMasterGetPDUSndLength() ); + eStatus = peMBMasterFrameSendCur( ucMBMasterGetDestAddress(), ucMBFrame, usMBMasterGetPDUSndLength() ); break; case EV_MASTER_ERROR_PROCESS: - vMBMasterSetIsBusy( FALSE ); + /* Execute specified error process callback function. */ + errorType = eMBMasterGetErrorType(); + vMBMasterGetPDUSndBuf( &ucMBFrame ); + switch (errorType) { + case EV_ERROR_RESPOND_TIMEOUT: + vMBMasterErrorCBRespondTimeout(ucMBMasterGetDestAddress(), + ucMBFrame, usMBMasterGetPDUSndLength()); + break; + case EV_ERROR_RECEIVE_DATA: + vMBMasterErrorCBReceiveData(ucMBMasterGetDestAddress(), + ucMBFrame, usMBMasterGetPDUSndLength()); + break; + case EV_ERROR_EXECUTE_FUNCTION: + vMBMasterErrorCBExecuteFunction(ucMBMasterGetDestAddress(), + ucMBFrame, usMBMasterGetPDUSndLength()); + break; + } + vMBMasterRunResRelease(); break; } } return MB_ENOERR; } -/* Get whether the Modbus Master is busy.*/ -BOOL xMBMasterGetIsBusy( void ) -{ - return xMasterIsBusy; -} -/* Set whether the Modbus Master is busy.*/ -void vMBMasterSetIsBusy( BOOL IsBusy ) -{ - xMasterIsBusy = IsBusy; -} + /* Get whether the Modbus Master is run in master mode.*/ BOOL xMBMasterGetCBRunInMasterMode( void ) { @@ -348,15 +380,27 @@ void vMBMasterSetCBRunInMasterMode( BOOL IsMasterMode ) { xMBRunInMasterMode = IsMasterMode; } -/* Get Modbus Master send destination address*/ +/* Get Modbus Master send destination address. */ UCHAR ucMBMasterGetDestAddress( void ) { return ucMBMasterDestAddress; } -/* Set Modbus Master send destination address*/ +/* Set Modbus Master send destination address. */ void vMBMasterSetDestAddress( UCHAR Address ) { ucMBMasterDestAddress = Address; } +/* Get Modbus Master current error event type. */ +eMBMasterErrorEventType eMBMasterGetErrorType( void ) +{ + return eMBMasterCurErrorType; +} +/* Set Modbus Master current error event type. */ +void vMBMasterSetErrorType( eMBMasterErrorEventType errorType ) +{ + eMBMasterCurErrorType = errorType; +} + + #endif diff --git a/components/net/freemodbus-v1.6.0/modbus/rtu/mbcrc.c b/components/net/freemodbus/modbus/rtu/mbcrc.c index 29b9ea765a..29b9ea765a 100644 --- a/components/net/freemodbus-v1.6.0/modbus/rtu/mbcrc.c +++ b/components/net/freemodbus/modbus/rtu/mbcrc.c diff --git a/components/net/freemodbus-v1.6.0/modbus/rtu/mbcrc.h b/components/net/freemodbus/modbus/rtu/mbcrc.h index db227763f1..db227763f1 100644 --- a/components/net/freemodbus-v1.6.0/modbus/rtu/mbcrc.h +++ b/components/net/freemodbus/modbus/rtu/mbcrc.h diff --git a/components/net/freemodbus-v1.6.0/modbus/rtu/mbrtu.c b/components/net/freemodbus/modbus/rtu/mbrtu.c index c023c92654..c023c92654 100644 --- a/components/net/freemodbus-v1.6.0/modbus/rtu/mbrtu.c +++ b/components/net/freemodbus/modbus/rtu/mbrtu.c diff --git a/components/net/freemodbus-v1.6.0/modbus/rtu/mbrtu.h b/components/net/freemodbus/modbus/rtu/mbrtu.h index 98c43de4aa..98c43de4aa 100644 --- a/components/net/freemodbus-v1.6.0/modbus/rtu/mbrtu.h +++ b/components/net/freemodbus/modbus/rtu/mbrtu.h diff --git a/components/net/freemodbus-v1.6.0/modbus/rtu/mbrtu_m.c b/components/net/freemodbus/modbus/rtu/mbrtu_m.c index fffbb23f9f..987c9a3156 100644 --- a/components/net/freemodbus-v1.6.0/modbus/rtu/mbrtu_m.c +++ b/components/net/freemodbus/modbus/rtu/mbrtu_m.c @@ -74,7 +74,7 @@ static volatile eMBMasterRcvState eRcvState; static volatile UCHAR ucMasterRTUSndBuf[MB_PDU_SIZE_MAX]; static volatile UCHAR ucMasterRTURcvBuf[MB_SER_PDU_SIZE_MAX]; -static volatile UCHAR ucMasterSendPDULength; +static volatile USHORT usMasterSendPDULength; static volatile UCHAR *pucMasterSndBufferCur; static volatile USHORT usMasterSndBufferCount; @@ -235,7 +235,7 @@ xMBMasterRTUReceiveFSM( void ) BOOL xTaskNeedSwitch = FALSE; UCHAR ucByte; - assert_param( eSndState == STATE_M_TX_IDLE ); + assert_param(( eSndState == STATE_M_TX_IDLE ) || ( eSndState == STATE_M_TX_XFWR )); /* Always read the character. */ ( void )xMBMasterPortSerialGetByte( ( CHAR * ) & ucByte ); @@ -364,12 +364,15 @@ xMBMasterRTUTimerExpired(void) /* An error occured while receiving the frame. */ case STATE_M_RX_ERROR: + vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); + xNeedPoll = xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); break; /* Function called in an illegal state. */ default: assert_param( - ( eRcvState == STATE_M_RX_INIT ) || ( eRcvState == STATE_M_RX_RCV ) || ( eRcvState == STATE_M_RX_ERROR )); + ( eRcvState == STATE_M_RX_INIT ) || ( eRcvState == STATE_M_RX_RCV ) || + ( eRcvState == STATE_M_RX_ERROR ) || ( eRcvState == STATE_M_RX_IDLE )); break; } eRcvState = STATE_M_RX_IDLE; @@ -380,18 +383,24 @@ xMBMasterRTUTimerExpired(void) * If the frame is broadcast,The master will idle,and if the frame is not * broadcast.Notify the listener process error.*/ case STATE_M_TX_XFWR: - if ( xFrameIsBroadcast == FALSE ) xNeedPoll = xMBMasterPortEventPost(EV_MASTER_ERROR_PROCESS); + if ( xFrameIsBroadcast == FALSE ) { + vMBMasterSetErrorType(EV_ERROR_RESPOND_TIMEOUT); + xNeedPoll = xMBMasterPortEventPost(EV_MASTER_ERROR_PROCESS); + } break; /* Function called in an illegal state. */ default: - assert_param( eSndState == STATE_M_TX_XFWR ); + assert_param( + ( eSndState == STATE_M_TX_XFWR ) || ( eSndState == STATE_M_TX_IDLE )); break; } eSndState = STATE_M_TX_IDLE; vMBMasterPortTimersDisable( ); - /* If timer mode is convert delay ,then Master is idel now. */ - if (eMasterCurTimerMode == MB_TMODE_CONVERT_DELAY) vMBMasterSetIsBusy( FALSE ); + /* If timer mode is convert delay, the master event then turns EV_MASTER_EXECUTE status. */ + if (eMasterCurTimerMode == MB_TMODE_CONVERT_DELAY) { + xNeedPoll = xMBMasterPortEventPost( EV_MASTER_EXECUTE ); + } return xNeedPoll; } @@ -409,15 +418,15 @@ void vMBMasterGetPDUSndBuf( UCHAR ** pucFrame ) } /* Set Modbus Master send PDU's buffer length.*/ -void vMBMasterSetPDUSndLength( UCHAR SendPDULength ) +void vMBMasterSetPDUSndLength( USHORT SendPDULength ) { - ucMasterSendPDULength = SendPDULength; + usMasterSendPDULength = SendPDULength; } /* Get Modbus Master send PDU's buffer length.*/ -UCHAR ucMBMasterGetPDUSndLength( void ) +USHORT usMBMasterGetPDUSndLength( void ) { - return ucMasterSendPDULength; + return usMasterSendPDULength; } /* Set Modbus Master current timer mode.*/ @@ -425,5 +434,10 @@ void vMBMasterSetCurTimerMode( eMBMasterTimerMode eMBTimerMode ) { eMasterCurTimerMode = eMBTimerMode; } + +/* The master request is broadcast? */ +BOOL xMBMasterRequestIsBroadcast( void ){ + return xFrameIsBroadcast; +} #endif diff --git a/components/net/freemodbus-v1.6.0/modbus/tcp/mbtcp.c b/components/net/freemodbus/modbus/tcp/mbtcp.c index 3eb3b7071f..3eb3b7071f 100644 --- a/components/net/freemodbus-v1.6.0/modbus/tcp/mbtcp.c +++ b/components/net/freemodbus/modbus/tcp/mbtcp.c diff --git a/components/net/freemodbus-v1.6.0/modbus/tcp/mbtcp.h b/components/net/freemodbus/modbus/tcp/mbtcp.h index 905d113c5a..905d113c5a 100644 --- a/components/net/freemodbus-v1.6.0/modbus/tcp/mbtcp.h +++ b/components/net/freemodbus/modbus/tcp/mbtcp.h diff --git a/components/net/freemodbus-v1.6.0/port/port.c b/components/net/freemodbus/port/port.c index 459481cc1d..d01c5c9d6a 100644 --- a/components/net/freemodbus-v1.6.0/port/port.c +++ b/components/net/freemodbus/port/port.c @@ -1,6 +1,6 @@ /* - * FreeModbus Libary: LPC214X Port - * Copyright (C) 2007 Tiago Prado Lone <[email protected]> + * FreeModbus Libary: RT-Thread Port + * Copyright (C) 2013 Armink <[email protected]> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,7 +16,7 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * - * File: $Id: port.c,v 1.1 2007/04/24 23:15:18 wolti Exp $ + * File: $Id: port.c,v 1.60 2015/02/01 9:18:05 Armink $ */ /* ----------------------- System includes --------------------------------*/ @@ -24,16 +24,15 @@ /* ----------------------- Modbus includes ----------------------------------*/ #include "port.h" /* ----------------------- Variables ----------------------------------------*/ - +static rt_base_t level; /* ----------------------- Start implementation -----------------------------*/ void EnterCriticalSection(void) { - //�ر�ȫ���ж� - __disable_irq(); + level = rt_hw_interrupt_disable(); } void ExitCriticalSection(void) { - //����ȫ���ж� - __enable_irq(); + rt_hw_interrupt_enable(level); } + diff --git a/components/net/freemodbus-v1.6.0/port/port.h b/components/net/freemodbus/port/port.h index c79df3d887..73d2177c9a 100644 --- a/components/net/freemodbus-v1.6.0/port/port.h +++ b/components/net/freemodbus/port/port.h @@ -1,6 +1,6 @@ /* * FreeModbus Libary: BARE Port - * Copyright (C) 2006 Christian Walter <[email protected]> + * Copyright (C) 2013 Armink <[email protected]> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -30,22 +30,13 @@ #include <assert.h> #include <inttypes.h> -#define INLINE +#define INLINE #define PR_BEGIN_EXTERN_C extern "C" { -#define PR_END_EXTERN_C } +#define PR_END_EXTERN_C } -//TODO ��ʱ��дB13���ţ�����������ʱ��ȷ�� -#define SLAVE_RS485_SEND_MODE GPIO_SetBits(GPIOB,GPIO_Pin_13) -#define SLAVE_RS485_RECEIVE_MODE GPIO_ResetBits(GPIOB,GPIO_Pin_13) -#define MASTER_RS485_SEND_MODE GPIO_SetBits(GPIOB,GPIO_Pin_13) -#define MASTER_RS485_RECEIVE_MODE GPIO_ResetBits(GPIOB,GPIO_Pin_13) - -#define ENTER_CRITICAL_SECTION() EnterCriticalSection() +#define ENTER_CRITICAL_SECTION() EnterCriticalSection() #define EXIT_CRITICAL_SECTION() ExitCriticalSection() -void EnterCriticalSection(void); -void ExitCriticalSection(void); - typedef uint8_t BOOL; typedef unsigned char UCHAR; @@ -65,4 +56,7 @@ typedef int32_t LONG; #define FALSE 0 #endif +void EnterCriticalSection(void); +void ExitCriticalSection(void); + #endif diff --git a/components/net/freemodbus-v1.6.0/port/portevent.c b/components/net/freemodbus/port/portevent.c index 86c7b5e7a5..1a881166be 100644 --- a/components/net/freemodbus-v1.6.0/port/portevent.c +++ b/components/net/freemodbus/port/portevent.c @@ -1,5 +1,5 @@ /* - * FreeModbus Libary: STM32 Port + * FreeModbus Libary: RT-Thread Port * Copyright (C) 2013 Armink <[email protected]> * * This library is free software; you can redistribute it and/or @@ -24,35 +24,45 @@ #include "mbport.h" /* ----------------------- Variables ----------------------------------------*/ -static eMBEventType eQueuedEvent; -static BOOL xEventInQueue; - +static struct rt_event xSlaveOsEvent; /* ----------------------- Start implementation -----------------------------*/ BOOL xMBPortEventInit( void ) { - xEventInQueue = FALSE; + rt_event_init(&xSlaveOsEvent,"slave event",RT_IPC_FLAG_PRIO); return TRUE; } BOOL xMBPortEventPost( eMBEventType eEvent ) { - xEventInQueue = TRUE; - eQueuedEvent = eEvent; + rt_event_send(&xSlaveOsEvent, eEvent); return TRUE; } BOOL xMBPortEventGet( eMBEventType * eEvent ) { - BOOL xEventHappened = FALSE; - - if( xEventInQueue ) + rt_uint32_t recvedEvent; + /* waiting forever OS event */ + rt_event_recv(&xSlaveOsEvent, + EV_READY | EV_FRAME_RECEIVED | EV_EXECUTE | EV_FRAME_SENT, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, + &recvedEvent); + switch (recvedEvent) { - *eEvent = eQueuedEvent; - xEventInQueue = FALSE; - xEventHappened = TRUE; + case EV_READY: + *eEvent = EV_READY; + break; + case EV_FRAME_RECEIVED: + *eEvent = EV_FRAME_RECEIVED; + break; + case EV_EXECUTE: + *eEvent = EV_EXECUTE; + break; + case EV_FRAME_SENT: + *eEvent = EV_FRAME_SENT; + break; } - return xEventHappened; + return TRUE; } diff --git a/components/net/freemodbus/port/portevent_m.c b/components/net/freemodbus/port/portevent_m.c new file mode 100644 index 0000000000..031a3b84ef --- /dev/null +++ b/components/net/freemodbus/port/portevent_m.c @@ -0,0 +1,239 @@ +/* + * FreeModbus Libary: RT-Thread Port + * Copyright (C) 2013 Armink <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: portevent_m.c v 1.60 2013/08/13 15:07:05 Armink add Master Functions$ + */ + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mb_m.h" +#include "mbport.h" +#include "port.h" + +#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 +/* ----------------------- Defines ------------------------------------------*/ +/* ----------------------- Variables ----------------------------------------*/ +static struct rt_semaphore xMasterRunRes; +static struct rt_event xMasterOsEvent; +/* ----------------------- Start implementation -----------------------------*/ +BOOL +xMBMasterPortEventInit( void ) +{ + rt_event_init(&xMasterOsEvent,"master event",RT_IPC_FLAG_PRIO); + return TRUE; +} + +BOOL +xMBMasterPortEventPost( eMBMasterEventType eEvent ) +{ + rt_event_send(&xMasterOsEvent, eEvent); + return TRUE; +} + +BOOL +xMBMasterPortEventGet( eMBMasterEventType * eEvent ) +{ + rt_uint32_t recvedEvent; + /* waiting forever OS event */ + rt_event_recv(&xMasterOsEvent, + EV_MASTER_READY | EV_MASTER_FRAME_RECEIVED | EV_MASTER_EXECUTE | + EV_MASTER_FRAME_SENT | EV_MASTER_ERROR_PROCESS, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, + &recvedEvent); + /* the enum type couldn't convert to int type */ + switch (recvedEvent) + { + case EV_MASTER_READY: + *eEvent = EV_MASTER_READY; + break; + case EV_MASTER_FRAME_RECEIVED: + *eEvent = EV_MASTER_FRAME_RECEIVED; + break; + case EV_MASTER_EXECUTE: + *eEvent = EV_MASTER_EXECUTE; + break; + case EV_MASTER_FRAME_SENT: + *eEvent = EV_MASTER_FRAME_SENT; + break; + case EV_MASTER_ERROR_PROCESS: + *eEvent = EV_MASTER_ERROR_PROCESS; + break; + } + return TRUE; +} +/** + * This function is initialize the OS resource for modbus master. + * Note:The resource is define by OS.If you not use OS this function can be empty. + * + */ +void vMBMasterOsResInit( void ) +{ + rt_sem_init(&xMasterRunRes, "master res", 0x01 , RT_IPC_FLAG_PRIO); +} + +/** + * This function is take Mobus Master running resource. + * Note:The resource is define by Operating System.If you not use OS this function can be just return TRUE. + * + * @param lTimeOut the waiting time. + * + * @return resource taked result + */ +BOOL xMBMasterRunResTake( LONG lTimeOut ) +{ + /*If waiting time is -1 .It will wait forever */ + return rt_sem_take(&xMasterRunRes, lTimeOut) ? FALSE : TRUE ; +} + +/** + * This function is release Mobus Master running resource. + * Note:The resource is define by Operating System.If you not use OS this function can be empty. + * + */ +void vMBMasterRunResRelease( void ) +{ + /* release resource */ + rt_sem_release(&xMasterRunRes); +} + +/** + * This is modbus master respond timeout error process callback function. + * @note There functions will block modbus master poll while execute OS waiting. + * So,for real-time of system.Do not execute too much waiting process. + * + * @param ucDestAddress destination salve address + * @param pucPDUData PDU buffer data + * @param ucPDULength PDU buffer length + * + */ +void vMBMasterErrorCBRespondTimeout(UCHAR ucDestAddress, const UCHAR* pucPDUData, + USHORT ucPDULength) { + /** + * @note This code is use OS's event mechanism for modbus master protocol stack. + * If you don't use OS, you can change it. + */ + rt_event_send(&xMasterOsEvent, EV_MASTER_ERROR_RESPOND_TIMEOUT); + + /* You can add your code under here. */ + +} + +/** + * This is modbus master receive data error process callback function. + * @note There functions will block modbus master poll while execute OS waiting. + * So,for real-time of system.Do not execute too much waiting process. + * + * @param ucDestAddress destination salve address + * @param pucPDUData PDU buffer data + * @param ucPDULength PDU buffer length + * + */ +void vMBMasterErrorCBReceiveData(UCHAR ucDestAddress, const UCHAR* pucPDUData, + USHORT ucPDULength) { + /** + * @note This code is use OS's event mechanism for modbus master protocol stack. + * If you don't use OS, you can change it. + */ + rt_event_send(&xMasterOsEvent, EV_MASTER_ERROR_RECEIVE_DATA); + + /* You can add your code under here. */ + +} + +/** + * This is modbus master execute function error process callback function. + * @note There functions will block modbus master poll while execute OS waiting. + * So,for real-time of system.Do not execute too much waiting process. + * + * @param ucDestAddress destination salve address + * @param pucPDUData PDU buffer data + * @param ucPDULength PDU buffer length + * + */ +void vMBMasterErrorCBExecuteFunction(UCHAR ucDestAddress, const UCHAR* pucPDUData, + USHORT ucPDULength) { + /** + * @note This code is use OS's event mechanism for modbus master protocol stack. + * If you don't use OS, you can change it. + */ + rt_event_send(&xMasterOsEvent, EV_MASTER_ERROR_EXECUTE_FUNCTION); + + /* You can add your code under here. */ + +} + +/** + * This is modbus master request process success callback function. + * @note There functions will block modbus master poll while execute OS waiting. + * So,for real-time of system.Do not execute too much waiting process. + * + */ +void vMBMasterCBRequestScuuess( void ) { + /** + * @note This code is use OS's event mechanism for modbus master protocol stack. + * If you don't use OS, you can change it. + */ + rt_event_send(&xMasterOsEvent, EV_MASTER_PROCESS_SUCESS); + + /* You can add your code under here. */ + +} + +/** + * This function is wait for modbus master request finish and return result. + * Waiting result include request process success, request respond timeout, + * receive data error and execute function error.You can use the above callback function. + * @note If you are use OS, you can use OS's event mechanism. Otherwise you have to run + * much user custom delay for waiting. + * + * @return request error code + */ +eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ) { + eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; + rt_uint32_t recvedEvent; + /* waiting for OS event */ + rt_event_recv(&xMasterOsEvent, + EV_MASTER_PROCESS_SUCESS | EV_MASTER_ERROR_RESPOND_TIMEOUT + | EV_MASTER_ERROR_RECEIVE_DATA + | EV_MASTER_ERROR_EXECUTE_FUNCTION, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, + &recvedEvent); + switch (recvedEvent) + { + case EV_MASTER_PROCESS_SUCESS: + break; + case EV_MASTER_ERROR_RESPOND_TIMEOUT: + { + eErrStatus = MB_MRE_TIMEDOUT; + break; + } + case EV_MASTER_ERROR_RECEIVE_DATA: + { + eErrStatus = MB_MRE_REV_DATA; + break; + } + case EV_MASTER_ERROR_EXECUTE_FUNCTION: + { + eErrStatus = MB_MRE_EXE_FUN; + break; + } + } + return eErrStatus; +} + +#endif diff --git a/components/net/freemodbus/port/portserial.c b/components/net/freemodbus/port/portserial.c new file mode 100644 index 0000000000..317c7f4605 --- /dev/null +++ b/components/net/freemodbus/port/portserial.c @@ -0,0 +1,222 @@ +/* + * FreeModbus Libary: RT-Thread Port + * Copyright (C) 2013 Armink <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: portserial.c,v 1.60 2013/08/13 15:07:05 Armink $ + */ + +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" +#include "rtdevice.h" +#include "board.h" + +/* ----------------------- Static variables ---------------------------------*/ +ALIGN(RT_ALIGN_SIZE) +/* software simulation serial transmit IRQ handler thread stack */ +static rt_uint8_t serial_soft_trans_irq_stack[512]; +/* software simulation serial transmit IRQ handler thread */ +static struct rt_thread thread_serial_soft_trans_irq; +/* serial event */ +static struct rt_event event_serial; +/* modbus slave serial device */ +static rt_serial_t *serial; + +/* ----------------------- Defines ------------------------------------------*/ +/* serial transmit event */ +#define EVENT_SERIAL_TRANS_START (1<<0) + +/* ----------------------- static functions ---------------------------------*/ +static void prvvUARTTxReadyISR(void); +static void prvvUARTRxISR(void); +static rt_err_t serial_rx_ind(rt_device_t dev, rt_size_t size); +static void serial_soft_trans_irq(void* parameter); + +/* ----------------------- Start implementation -----------------------------*/ +BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, + eMBParity eParity) +{ + /** + * set 485 mode receive and transmit control IO + * @note MODBUS_SLAVE_RT_CONTROL_PIN_INDEX need be defined by user + */ + rt_pin_mode(MODBUS_SLAVE_RT_CONTROL_PIN_INDEX, PIN_MODE_OUTPUT); + + /* set serial name */ + if (ucPORT == 1) { +#if defined(RT_USING_UART1) || defined(RT_USING_REMAP_UART1) + extern struct rt_serial_device serial1; + serial = &serial1; +#endif + } else if (ucPORT == 2) { +#if defined(RT_USING_UART2) + extern struct rt_serial_device serial2; + serial = &serial2; +#endif + } else if (ucPORT == 3) { +#if defined(RT_USING_UART3) + extern struct rt_serial_device serial3; + serial = &serial3; +#endif + } + /* set serial configure parameter */ + serial->config.baud_rate = ulBaudRate; + serial->config.stop_bits = STOP_BITS_1; + switch(eParity){ + case MB_PAR_NONE: { + serial->config.data_bits = DATA_BITS_8; + serial->config.parity = PARITY_NONE; + break; + } + case MB_PAR_ODD: { + serial->config.data_bits = DATA_BITS_9; + serial->config.parity = PARITY_ODD; + break; + } + case MB_PAR_EVEN: { + serial->config.data_bits = DATA_BITS_9; + serial->config.parity = PARITY_EVEN; + break; + } + } + /* set serial configure */ + serial->ops->configure(serial, &(serial->config)); + + /* open serial device */ + if (!serial->parent.open(&serial->parent, + RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX )) { + serial->parent.rx_indicate = serial_rx_ind; + } else { + return FALSE; + } + + /* software initialize */ + rt_thread_init(&thread_serial_soft_trans_irq, + "slave trans", + serial_soft_trans_irq, + RT_NULL, + serial_soft_trans_irq_stack, + sizeof(serial_soft_trans_irq_stack), + 10, 5); + rt_thread_startup(&thread_serial_soft_trans_irq); + rt_event_init(&event_serial, "slave event", RT_IPC_FLAG_PRIO); + + return TRUE; +} + +void vMBPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable) +{ + rt_uint32_t recved_event; + if (xRxEnable) + { + /* enable RX interrupt */ + serial->ops->control(serial, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_FLAG_INT_RX); + /* switch 485 to receive mode */ + rt_pin_write(MODBUS_SLAVE_RT_CONTROL_PIN_INDEX, PIN_LOW); + } + else + { + /* switch 485 to transmit mode */ + rt_pin_write(MODBUS_SLAVE_RT_CONTROL_PIN_INDEX, PIN_HIGH); + /* disable RX interrupt */ + serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *)RT_DEVICE_FLAG_INT_RX); + } + if (xTxEnable) + { + /* start serial transmit */ + rt_event_send(&event_serial, EVENT_SERIAL_TRANS_START); + } + else + { + /* stop serial transmit */ + rt_event_recv(&event_serial, EVENT_SERIAL_TRANS_START, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 0, + &recved_event); + } +} + +void vMBPortClose(void) +{ + serial->parent.close(&(serial->parent)); +} + +BOOL xMBPortSerialPutByte(CHAR ucByte) +{ + serial->parent.write(&(serial->parent), 0, &ucByte, 1); + return TRUE; +} + +BOOL xMBPortSerialGetByte(CHAR * pucByte) +{ + serial->parent.read(&(serial->parent), 0, pucByte, 1); + return TRUE; +} + +/* + * Create an interrupt handler for the transmit buffer empty interrupt + * (or an equivalent) for your target processor. This function should then + * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that + * a new character can be sent. The protocol stack will then call + * xMBPortSerialPutByte( ) to send the character. + */ +void prvvUARTTxReadyISR(void) +{ + pxMBFrameCBTransmitterEmpty(); +} + +/* + * Create an interrupt handler for the receive interrupt for your target + * processor. This function should then call pxMBFrameCBByteReceived( ). The + * protocol stack will then call xMBPortSerialGetByte( ) to retrieve the + * character. + */ +void prvvUARTRxISR(void) +{ + pxMBFrameCBByteReceived(); +} + +/** + * Software simulation serial transmit IRQ handler. + * + * @param parameter parameter + */ +static void serial_soft_trans_irq(void* parameter) { + rt_uint32_t recved_event; + while (1) + { + /* waiting for serial transmit start */ + rt_event_recv(&event_serial, EVENT_SERIAL_TRANS_START, RT_EVENT_FLAG_OR, + RT_WAITING_FOREVER, &recved_event); + /* execute modbus callback */ + prvvUARTTxReadyISR(); + } +} + +/** + * This function is serial receive callback function + * + * @param dev the device of serial + * @param size the data size that receive + * + * @return return RT_EOK + */ +static rt_err_t serial_rx_ind(rt_device_t dev, rt_size_t size) { + prvvUARTRxISR(); + return RT_EOK; +} diff --git a/components/net/freemodbus/port/portserial_m.c b/components/net/freemodbus/port/portserial_m.c new file mode 100644 index 0000000000..8ec0d081f1 --- /dev/null +++ b/components/net/freemodbus/port/portserial_m.c @@ -0,0 +1,225 @@ +/* + * FreeModbus Libary: RT-Thread Port + * Copyright (C) 2013 Armink <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: portserial_m.c,v 1.60 2013/08/13 15:07:05 Armink add Master Functions $ + */ + +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" +#include "rtdevice.h" +#include "board.h" + +#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 +/* ----------------------- Static variables ---------------------------------*/ +ALIGN(RT_ALIGN_SIZE) +/* software simulation serial transmit IRQ handler thread stack */ +static rt_uint8_t serial_soft_trans_irq_stack[512]; +/* software simulation serial transmit IRQ handler thread */ +static struct rt_thread thread_serial_soft_trans_irq; +/* serial event */ +static struct rt_event event_serial; +/* modbus slave serial device */ +static rt_serial_t *serial; + +/* ----------------------- Defines ------------------------------------------*/ +/* serial transmit event */ +#define EVENT_SERIAL_TRANS_START (1<<0) + +/* ----------------------- static functions ---------------------------------*/ +static void prvvUARTTxReadyISR(void); +static void prvvUARTRxISR(void); +static rt_err_t serial_rx_ind(rt_device_t dev, rt_size_t size); +static void serial_soft_trans_irq(void* parameter); + +/* ----------------------- Start implementation -----------------------------*/ +BOOL xMBMasterPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, + eMBParity eParity) +{ + /** + * set 485 mode receive and transmit control IO + * @note MODBUS_MASTER_RT_CONTROL_PIN_INDEX need be defined by user + */ + rt_pin_mode(MODBUS_MASTER_RT_CONTROL_PIN_INDEX, PIN_MODE_OUTPUT); + + /* set serial name */ + if (ucPORT == 1) { +#if defined(RT_USING_UART1) || defined(RT_USING_REMAP_UART1) + extern struct rt_serial_device serial1; + serial = &serial1; +#endif + } else if (ucPORT == 2) { +#if defined(RT_USING_UART2) + extern struct rt_serial_device serial2; + serial = &serial2; +#endif + } else if (ucPORT == 3) { +#if defined(RT_USING_UART3) + extern struct rt_serial_device serial3; + serial = &serial3; +#endif + } + /* set serial configure parameter */ + serial->config.baud_rate = ulBaudRate; + serial->config.stop_bits = STOP_BITS_1; + switch(eParity){ + case MB_PAR_NONE: { + serial->config.data_bits = DATA_BITS_8; + serial->config.parity = PARITY_NONE; + break; + } + case MB_PAR_ODD: { + serial->config.data_bits = DATA_BITS_9; + serial->config.parity = PARITY_ODD; + break; + } + case MB_PAR_EVEN: { + serial->config.data_bits = DATA_BITS_9; + serial->config.parity = PARITY_EVEN; + break; + } + } + /* set serial configure */ + serial->ops->configure(serial, &(serial->config)); + + /* open serial device */ + if (!serial->parent.open(&serial->parent, + RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX )) { + serial->parent.rx_indicate = serial_rx_ind; + } else { + return FALSE; + } + + /* software initialize */ + rt_thread_init(&thread_serial_soft_trans_irq, + "slave trans", + serial_soft_trans_irq, + RT_NULL, + serial_soft_trans_irq_stack, + sizeof(serial_soft_trans_irq_stack), + 10, 5); + rt_thread_startup(&thread_serial_soft_trans_irq); + rt_event_init(&event_serial, "slave event", RT_IPC_FLAG_PRIO); + + return TRUE; +} + +void vMBMasterPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable) +{ + rt_uint32_t recved_event; + if (xRxEnable) + { + /* enable RX interrupt */ + serial->ops->control(serial, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_FLAG_INT_RX); + /* switch 485 to receive mode */ + rt_pin_write(MODBUS_MASTER_RT_CONTROL_PIN_INDEX, PIN_LOW); + } + else + { + /* switch 485 to transmit mode */ + rt_pin_write(MODBUS_MASTER_RT_CONTROL_PIN_INDEX, PIN_HIGH); + /* disable RX interrupt */ + serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *)RT_DEVICE_FLAG_INT_RX); + } + if (xTxEnable) + { + /* start serial transmit */ + rt_event_send(&event_serial, EVENT_SERIAL_TRANS_START); + } + else + { + /* stop serial transmit */ + rt_event_recv(&event_serial, EVENT_SERIAL_TRANS_START, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 0, + &recved_event); + } +} + +void vMBMasterPortClose(void) +{ + serial->parent.close(&(serial->parent)); +} + +BOOL xMBMasterPortSerialPutByte(CHAR ucByte) +{ + serial->parent.write(&(serial->parent), 0, &ucByte, 1); + return TRUE; +} + +BOOL xMBMasterPortSerialGetByte(CHAR * pucByte) +{ + serial->parent.read(&(serial->parent), 0, pucByte, 1); + return TRUE; +} + +/* + * Create an interrupt handler for the transmit buffer empty interrupt + * (or an equivalent) for your target processor. This function should then + * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that + * a new character can be sent. The protocol stack will then call + * xMBPortSerialPutByte( ) to send the character. + */ +void prvvUARTTxReadyISR(void) +{ + pxMBMasterFrameCBTransmitterEmpty(); +} + +/* + * Create an interrupt handler for the receive interrupt for your target + * processor. This function should then call pxMBFrameCBByteReceived( ). The + * protocol stack will then call xMBPortSerialGetByte( ) to retrieve the + * character. + */ +void prvvUARTRxISR(void) +{ + pxMBMasterFrameCBByteReceived(); +} + +/** + * Software simulation serial transmit IRQ handler. + * + * @param parameter parameter + */ +static void serial_soft_trans_irq(void* parameter) { + rt_uint32_t recved_event; + while (1) + { + /* waiting for serial transmit start */ + rt_event_recv(&event_serial, EVENT_SERIAL_TRANS_START, RT_EVENT_FLAG_OR, + RT_WAITING_FOREVER, &recved_event); + /* execute modbus callback */ + prvvUARTTxReadyISR(); + } +} + +/** + * This function is serial receive callback function + * + * @param dev the device of serial + * @param size the data size that receive + * + * @return return RT_EOK + */ +static rt_err_t serial_rx_ind(rt_device_t dev, rt_size_t size) { + prvvUARTRxISR(); + return RT_EOK; +} + +#endif diff --git a/components/net/freemodbus-v1.6.0/port/portevent_m.c b/components/net/freemodbus/port/porttimer.c index c78b6cbcb2..6f017d8759 100644 --- a/components/net/freemodbus-v1.6.0/port/portevent_m.c +++ b/components/net/freemodbus/port/porttimer.c @@ -1,5 +1,5 @@ /* - * FreeModbus Libary: STM32 Port + * FreeModbus Libary: RT-Thread Port * Copyright (C) 2013 Armink <[email protected]> * * This library is free software; you can redistribute it and/or @@ -16,46 +16,48 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * - * File: $Id: portevent_m.c v 1.60 2013/08/13 15:07:05 Armink add Master Functions$ + * File: $Id: porttimer.c,v 1.60 2013/08/13 15:07:05 Armink $ */ +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + /* ----------------------- Modbus includes ----------------------------------*/ #include "mb.h" #include "mbport.h" -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED -/* ----------------------- Variables ----------------------------------------*/ -static eMBMasterEventType eMasterQueuedEvent; -static BOOL xMasterEventInQueue; +/* ----------------------- static functions ---------------------------------*/ +static struct rt_timer timer; +static void prvvTIMERExpiredISR(void); +static void timer_timeout_ind(void* parameter); /* ----------------------- Start implementation -----------------------------*/ -BOOL -xMBMasterPortEventInit( void ) +BOOL xMBPortTimersInit(USHORT usTim1Timerout50us) { - xMasterEventInQueue = FALSE; + rt_timer_init(&timer, "slave timer", + timer_timeout_ind, /* bind timeout callback function */ + RT_NULL, + (50*usTim1Timerout50us)/(1000*1000/RT_TICK_PER_SECOND), + RT_TIMER_FLAG_ONE_SHOT); /* one shot */ return TRUE; } -BOOL -xMBMasterPortEventPost( eMBMasterEventType eEvent ) +void vMBPortTimersEnable() { - xMasterEventInQueue = TRUE; - eMasterQueuedEvent = eEvent; - return TRUE; + rt_timer_start(&timer); } -BOOL -xMBMasterPortEventGet( eMBMasterEventType * eEvent ) +void vMBPortTimersDisable() { - BOOL xEventHappened = FALSE; + rt_timer_stop(&timer); +} - if( xMasterEventInQueue ) - { - *eEvent = eMasterQueuedEvent; - xMasterEventInQueue = FALSE; - xEventHappened = TRUE; - } - return xEventHappened; +void prvvTIMERExpiredISR(void) +{ + (void) pxMBPortCBTimerExpired(); } -#endif +static void timer_timeout_ind(void* parameter) +{ + prvvTIMERExpiredISR(); +} diff --git a/components/net/freemodbus/port/porttimer_m.c b/components/net/freemodbus/port/porttimer_m.c new file mode 100644 index 0000000000..00441bfd1c --- /dev/null +++ b/components/net/freemodbus/port/porttimer_m.c @@ -0,0 +1,107 @@ +/* + * FreeModbus Libary: RT-Thread Port + * Copyright (C) 2013 Armink <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: porttimer_m.c,v 1.60 2013/08/13 15:07:05 Armink add Master Functions$ + */ + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mb_m.h" +#include "mbport.h" + +#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 +/* ----------------------- Variables ----------------------------------------*/ +static USHORT usT35TimeOut50us; +static struct rt_timer timer; +static void prvvTIMERExpiredISR(void); +static void timer_timeout_ind(void* parameter); + +/* ----------------------- static functions ---------------------------------*/ +static void prvvTIMERExpiredISR(void); + +/* ----------------------- Start implementation -----------------------------*/ +BOOL xMBMasterPortTimersInit(USHORT usTimeOut50us) +{ + /* backup T35 ticks */ + usT35TimeOut50us = usTimeOut50us; + + rt_timer_init(&timer, "master timer", + timer_timeout_ind, /* bind timeout callback function */ + RT_NULL, + (50 * usT35TimeOut50us) / (1000 * 1000 / RT_TICK_PER_SECOND), + RT_TIMER_FLAG_ONE_SHOT); /* one shot */ + + return TRUE; +} + +void vMBMasterPortTimersT35Enable() +{ + rt_tick_t timer_tick = (50 * usT35TimeOut50us) + / (1000 * 1000 / RT_TICK_PER_SECOND); + + /* Set current timer mode, don't change it.*/ + vMBMasterSetCurTimerMode(MB_TMODE_T35); + + rt_timer_control(&timer, RT_TIMER_CTRL_SET_TIME, &timer_tick); + + rt_timer_start(&timer); +} + +void vMBMasterPortTimersConvertDelayEnable() +{ + rt_tick_t timer_tick = MB_MASTER_DELAY_MS_CONVERT * RT_TICK_PER_SECOND / 1000; + + /* Set current timer mode, don't change it.*/ + vMBMasterSetCurTimerMode(MB_TMODE_CONVERT_DELAY); + + rt_timer_control(&timer, RT_TIMER_CTRL_SET_TIME, &timer_tick); + + rt_timer_start(&timer); +} + +void vMBMasterPortTimersRespondTimeoutEnable() +{ + rt_tick_t timer_tick = MB_MASTER_TIMEOUT_MS_RESPOND * RT_TICK_PER_SECOND / 1000; + + /* Set current timer mode, don't change it.*/ + vMBMasterSetCurTimerMode(MB_TMODE_RESPOND_TIMEOUT); + + rt_timer_control(&timer, RT_TIMER_CTRL_SET_TIME, &timer_tick); + + rt_timer_start(&timer); +} + +void vMBMasterPortTimersDisable() +{ + rt_timer_stop(&timer); +} + +void prvvTIMERExpiredISR(void) +{ + (void) pxMBMasterPortCBTimerExpired(); +} + +static void timer_timeout_ind(void* parameter) +{ + prvvTIMERExpiredISR(); +} + +#endif diff --git a/components/net/freemodbus/port/user_mb_app.c b/components/net/freemodbus/port/user_mb_app.c new file mode 100644 index 0000000000..8da7376336 --- /dev/null +++ b/components/net/freemodbus/port/user_mb_app.c @@ -0,0 +1,286 @@ +/* + * FreeModbus Libary: user callback functions and buffer define in slave mode + * Copyright (C) 2013 Armink <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: user_mb_app.c,v 1.60 2013/11/23 11:49:05 Armink $ + */ +#include "user_mb_app.h" + +/*------------------------Slave mode use these variables----------------------*/ +//Slave mode:DiscreteInputs variables +USHORT usSDiscInStart = S_DISCRETE_INPUT_START; +#if S_DISCRETE_INPUT_NDISCRETES%8 +UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8+1]; +#else +UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8] ; +#endif +//Slave mode:Coils variables +USHORT usSCoilStart = S_COIL_START; +#if S_COIL_NCOILS%8 +UCHAR ucSCoilBuf[S_COIL_NCOILS/8+1] ; +#else +UCHAR ucSCoilBuf[S_COIL_NCOILS/8] ; +#endif +//Slave mode:InputRegister variables +USHORT usSRegInStart = S_REG_INPUT_START; +USHORT usSRegInBuf[S_REG_INPUT_NREGS] ; +//Slave mode:HoldingRegister variables +USHORT usSRegHoldStart = S_REG_HOLDING_START; +USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS] ; + +/** + * Modbus slave input register callback function. + * + * @param pucRegBuffer input register buffer + * @param usAddress input register address + * @param usNRegs input register number + * + * @return result + */ +eMBErrorCode eMBRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) +{ + eMBErrorCode eStatus = MB_ENOERR; + USHORT iRegIndex; + USHORT * pusRegInputBuf; + USHORT REG_INPUT_START; + USHORT REG_INPUT_NREGS; + USHORT usRegInStart; + + pusRegInputBuf = usSRegInBuf; + REG_INPUT_START = S_REG_INPUT_START; + REG_INPUT_NREGS = S_REG_INPUT_NREGS; + usRegInStart = usSRegInStart; + + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= REG_INPUT_START) + && (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS)) + { + iRegIndex = usAddress - usRegInStart; + while (usNRegs > 0) + { + *pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] >> 8); + *pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] & 0xFF); + iRegIndex++; + usNRegs--; + } + } + else + { + eStatus = MB_ENOREG; + } + + return eStatus; +} + +/** + * Modbus slave holding register callback function. + * + * @param pucRegBuffer holding register buffer + * @param usAddress holding register address + * @param usNRegs holding register number + * @param eMode read or write + * + * @return result + */ +eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNRegs, eMBRegisterMode eMode) +{ + eMBErrorCode eStatus = MB_ENOERR; + USHORT iRegIndex; + USHORT * pusRegHoldingBuf; + USHORT REG_HOLDING_START; + USHORT REG_HOLDING_NREGS; + USHORT usRegHoldStart; + + pusRegHoldingBuf = usSRegHoldBuf; + REG_HOLDING_START = S_REG_HOLDING_START; + REG_HOLDING_NREGS = S_REG_HOLDING_NREGS; + usRegHoldStart = usSRegHoldStart; + + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= REG_HOLDING_START) + && (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS)) + { + iRegIndex = usAddress - usRegHoldStart; + switch (eMode) + { + /* read current register values from the protocol stack. */ + case MB_REG_READ: + while (usNRegs > 0) + { + *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8); + *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF); + iRegIndex++; + usNRegs--; + } + break; + + /* write current register values with new values from the protocol stack. */ + case MB_REG_WRITE: + while (usNRegs > 0) + { + pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8; + pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++; + iRegIndex++; + usNRegs--; + } + break; + } + } + else + { + eStatus = MB_ENOREG; + } + return eStatus; +} + +/** + * Modbus slave coils callback function. + * + * @param pucRegBuffer coils buffer + * @param usAddress coils address + * @param usNCoils coils number + * @param eMode read or write + * + * @return result + */ +eMBErrorCode eMBRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNCoils, eMBRegisterMode eMode) +{ + eMBErrorCode eStatus = MB_ENOERR; + USHORT iRegIndex , iRegBitIndex , iNReg; + UCHAR * pucCoilBuf; + USHORT COIL_START; + USHORT COIL_NCOILS; + USHORT usCoilStart; + iNReg = usNCoils / 8 + 1; + + pucCoilBuf = ucSCoilBuf; + COIL_START = S_COIL_START; + COIL_NCOILS = S_COIL_NCOILS; + usCoilStart = usSCoilStart; + + /* it already plus one in modbus function method. */ + usAddress--; + + if( ( usAddress >= COIL_START ) && + ( usAddress + usNCoils <= COIL_START + COIL_NCOILS ) ) + { + iRegIndex = (USHORT) (usAddress - usCoilStart) / 8; + iRegBitIndex = (USHORT) (usAddress - usCoilStart) % 8; + switch ( eMode ) + { + /* read current coil values from the protocol stack. */ + case MB_REG_READ: + while (iNReg > 0) + { + *pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++], + iRegBitIndex, 8); + iNReg--; + } + pucRegBuffer--; + /* last coils */ + usNCoils = usNCoils % 8; + /* filling zero to high bit */ + *pucRegBuffer = *pucRegBuffer << (8 - usNCoils); + *pucRegBuffer = *pucRegBuffer >> (8 - usNCoils); + break; + + /* write current coil values with new values from the protocol stack. */ + case MB_REG_WRITE: + while (iNReg > 1) + { + xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, 8, + *pucRegBuffer++); + iNReg--; + } + /* last coils */ + usNCoils = usNCoils % 8; + /* xMBUtilSetBits has bug when ucNBits is zero */ + if (usNCoils != 0) + { + xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils, + *pucRegBuffer++); + } + break; + } + } + else + { + eStatus = MB_ENOREG; + } + return eStatus; +} + +/** + * Modbus slave discrete callback function. + * + * @param pucRegBuffer discrete buffer + * @param usAddress discrete address + * @param usNDiscrete discrete number + * + * @return result + */ +eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) +{ + eMBErrorCode eStatus = MB_ENOERR; + USHORT iRegIndex , iRegBitIndex , iNReg; + UCHAR * pucDiscreteInputBuf; + USHORT DISCRETE_INPUT_START; + USHORT DISCRETE_INPUT_NDISCRETES; + USHORT usDiscreteInputStart; + iNReg = usNDiscrete / 8 + 1; + + pucDiscreteInputBuf = ucSDiscInBuf; + DISCRETE_INPUT_START = S_DISCRETE_INPUT_START; + DISCRETE_INPUT_NDISCRETES = S_DISCRETE_INPUT_NDISCRETES; + usDiscreteInputStart = usSDiscInStart; + + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= DISCRETE_INPUT_START) + && (usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES)) + { + iRegIndex = (USHORT) (usAddress - usDiscreteInputStart) / 8; + iRegBitIndex = (USHORT) (usAddress - usDiscreteInputStart) % 8; + + while (iNReg > 0) + { + *pucRegBuffer++ = xMBUtilGetBits(&pucDiscreteInputBuf[iRegIndex++], + iRegBitIndex, 8); + iNReg--; + } + pucRegBuffer--; + /* last discrete */ + usNDiscrete = usNDiscrete % 8; + /* filling zero to high bit */ + *pucRegBuffer = *pucRegBuffer << (8 - usNDiscrete); + *pucRegBuffer = *pucRegBuffer >> (8 - usNDiscrete); + } + else + { + eStatus = MB_ENOREG; + } + + return eStatus; +} + diff --git a/components/net/freemodbus/port/user_mb_app.h b/components/net/freemodbus/port/user_mb_app.h new file mode 100644 index 0000000000..864c3860bf --- /dev/null +++ b/components/net/freemodbus/port/user_mb_app.h @@ -0,0 +1,46 @@ +#ifndef USER_APP +#define USER_APP +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mb_m.h" +#include "mbconfig.h" +#include "mbframe.h" +#include "mbutils.h" + +/* -----------------------Slave Defines -------------------------------------*/ +#define S_DISCRETE_INPUT_START 0 +#define S_DISCRETE_INPUT_NDISCRETES 16 +#define S_COIL_START 0 +#define S_COIL_NCOILS 64 +#define S_REG_INPUT_START 0 +#define S_REG_INPUT_NREGS 100 +#define S_REG_HOLDING_START 0 +#define S_REG_HOLDING_NREGS 100 +/* salve mode: holding register's all address */ +#define S_HD_RESERVE 0 +/* salve mode: input register's all address */ +#define S_IN_RESERVE 0 +/* salve mode: coil's all address */ +#define S_CO_RESERVE 0 +/* salve mode: discrete's all address */ +#define S_DI_RESERVE 0 + +/* -----------------------Master Defines -------------------------------------*/ +#define M_DISCRETE_INPUT_START 0 +#define M_DISCRETE_INPUT_NDISCRETES 16 +#define M_COIL_START 0 +#define M_COIL_NCOILS 64 +#define M_REG_INPUT_START 0 +#define M_REG_INPUT_NREGS 100 +#define M_REG_HOLDING_START 0 +#define M_REG_HOLDING_NREGS 100 +/* master mode: holding register's all address */ +#define M_HD_RESERVE 0 +/* master mode: input register's all address */ +#define M_IN_RESERVE 0 +/* master mode: coil's all address */ +#define M_CO_RESERVE 0 +/* master mode: discrete's all address */ +#define M_DI_RESERVE 0 + +#endif diff --git a/components/net/freemodbus/port/user_mb_app_m.c b/components/net/freemodbus/port/user_mb_app_m.c new file mode 100644 index 0000000000..12fabf21ac --- /dev/null +++ b/components/net/freemodbus/port/user_mb_app_m.c @@ -0,0 +1,294 @@ +/* + * FreeModbus Libary: user callback functions and buffer define in master mode + * Copyright (C) 2013 Armink <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: user_mb_app_m.c,v 1.60 2013/11/23 11:49:05 Armink $ + */ +#include "user_mb_app.h" + +/*-----------------------Master mode use these variables----------------------*/ +#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 +//Master mode:DiscreteInputs variables +USHORT usMDiscInStart = M_DISCRETE_INPUT_START; +#if M_DISCRETE_INPUT_NDISCRETES%8 +UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8+1]; +#else +UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8]; +#endif +//Master mode:Coils variables +USHORT usMCoilStart = M_COIL_START; +#if M_COIL_NCOILS%8 +UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8+1]; +#else +UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8]; +#endif +//Master mode:InputRegister variables +USHORT usMRegInStart = M_REG_INPUT_START; +USHORT usMRegInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_INPUT_NREGS]; +//Master mode:HoldingRegister variables +USHORT usMRegHoldStart = M_REG_HOLDING_START; +USHORT usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS]; + +/** + * Modbus master input register callback function. + * + * @param pucRegBuffer input register buffer + * @param usAddress input register address + * @param usNRegs input register number + * + * @return result + */ +eMBErrorCode eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) +{ + eMBErrorCode eStatus = MB_ENOERR; + USHORT iRegIndex; + USHORT * pusRegInputBuf; + USHORT REG_INPUT_START; + USHORT REG_INPUT_NREGS; + USHORT usRegInStart; + + pusRegInputBuf = usMRegInBuf[ucMBMasterGetDestAddress() - 1]; + REG_INPUT_START = M_REG_INPUT_START; + REG_INPUT_NREGS = M_REG_INPUT_NREGS; + usRegInStart = usMRegInStart; + + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= REG_INPUT_START) + && (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS)) + { + iRegIndex = usAddress - usRegInStart; + while (usNRegs > 0) + { + pusRegInputBuf[iRegIndex] = *pucRegBuffer++ << 8; + pusRegInputBuf[iRegIndex] |= *pucRegBuffer++; + iRegIndex++; + usNRegs--; + } + } + else + { + eStatus = MB_ENOREG; + } + + return eStatus; +} + +/** + * Modbus master holding register callback function. + * + * @param pucRegBuffer holding register buffer + * @param usAddress holding register address + * @param usNRegs holding register number + * @param eMode read or write + * + * @return result + */ +eMBErrorCode eMBMasterRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNRegs, eMBRegisterMode eMode) +{ + eMBErrorCode eStatus = MB_ENOERR; + USHORT iRegIndex; + USHORT * pusRegHoldingBuf; + USHORT REG_HOLDING_START; + USHORT REG_HOLDING_NREGS; + USHORT usRegHoldStart; + + pusRegHoldingBuf = usMRegHoldBuf[ucMBMasterGetDestAddress() - 1]; + REG_HOLDING_START = M_REG_HOLDING_START; + REG_HOLDING_NREGS = M_REG_HOLDING_NREGS; + usRegHoldStart = usMRegHoldStart; + /* if mode is read, the master will write the received date to buffer. */ + eMode = MB_REG_WRITE; + + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= REG_HOLDING_START) + && (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS)) + { + iRegIndex = usAddress - usRegHoldStart; + switch (eMode) + { + /* read current register values from the protocol stack. */ + case MB_REG_READ: + while (usNRegs > 0) + { + *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8); + *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF); + iRegIndex++; + usNRegs--; + } + break; + /* write current register values with new values from the protocol stack. */ + case MB_REG_WRITE: + while (usNRegs > 0) + { + pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8; + pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++; + iRegIndex++; + usNRegs--; + } + break; + } + } + else + { + eStatus = MB_ENOREG; + } + return eStatus; +} + +/** + * Modbus master coils callback function. + * + * @param pucRegBuffer coils buffer + * @param usAddress coils address + * @param usNCoils coils number + * @param eMode read or write + * + * @return result + */ +eMBErrorCode eMBMasterRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress, + USHORT usNCoils, eMBRegisterMode eMode) +{ + eMBErrorCode eStatus = MB_ENOERR; + USHORT iRegIndex , iRegBitIndex , iNReg; + UCHAR * pucCoilBuf; + USHORT COIL_START; + USHORT COIL_NCOILS; + USHORT usCoilStart; + iNReg = usNCoils / 8 + 1; + + pucCoilBuf = ucMCoilBuf[ucMBMasterGetDestAddress() - 1]; + COIL_START = M_COIL_START; + COIL_NCOILS = M_COIL_NCOILS; + usCoilStart = usMCoilStart; + + /* if mode is read,the master will write the received date to buffer. */ + eMode = MB_REG_WRITE; + + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= COIL_START) + && (usAddress + usNCoils <= COIL_START + COIL_NCOILS)) + { + iRegIndex = (USHORT) (usAddress - usCoilStart) / 8; + iRegBitIndex = (USHORT) (usAddress - usCoilStart) % 8; + switch (eMode) + { + /* read current coil values from the protocol stack. */ + case MB_REG_READ: + while (iNReg > 0) + { + *pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++], + iRegBitIndex, 8); + iNReg--; + } + pucRegBuffer--; + /* last coils */ + usNCoils = usNCoils % 8; + /* filling zero to high bit */ + *pucRegBuffer = *pucRegBuffer << (8 - usNCoils); + *pucRegBuffer = *pucRegBuffer >> (8 - usNCoils); + break; + + /* write current coil values with new values from the protocol stack. */ + case MB_REG_WRITE: + while (iNReg > 1) + { + xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, 8, + *pucRegBuffer++); + iNReg--; + } + /* last coils */ + usNCoils = usNCoils % 8; + /* xMBUtilSetBits has bug when ucNBits is zero */ + if (usNCoils != 0) + { + xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils, + *pucRegBuffer++); + } + break; + } + } + else + { + eStatus = MB_ENOREG; + } + return eStatus; +} + +/** + * Modbus master discrete callback function. + * + * @param pucRegBuffer discrete buffer + * @param usAddress discrete address + * @param usNDiscrete discrete number + * + * @return result + */ +eMBErrorCode eMBMasterRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) +{ + eMBErrorCode eStatus = MB_ENOERR; + USHORT iRegIndex , iRegBitIndex , iNReg; + UCHAR * pucDiscreteInputBuf; + USHORT DISCRETE_INPUT_START; + USHORT DISCRETE_INPUT_NDISCRETES; + USHORT usDiscreteInputStart; + iNReg = usNDiscrete / 8 + 1; + + pucDiscreteInputBuf = ucMDiscInBuf[ucMBMasterGetDestAddress() - 1]; + DISCRETE_INPUT_START = M_DISCRETE_INPUT_START; + DISCRETE_INPUT_NDISCRETES = M_DISCRETE_INPUT_NDISCRETES; + usDiscreteInputStart = usMDiscInStart; + + /* it already plus one in modbus function method. */ + usAddress--; + + if ((usAddress >= DISCRETE_INPUT_START) + && (usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES)) + { + iRegIndex = (USHORT) (usAddress - usDiscreteInputStart) / 8; + iRegBitIndex = (USHORT) (usAddress - usDiscreteInputStart) % 8; + + /* write current discrete values with new values from the protocol stack. */ + while (iNReg > 1) + { + xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++], iRegBitIndex, 8, + *pucRegBuffer++); + iNReg--; + } + /* last discrete */ + usNDiscrete = usNDiscrete % 8; + /* xMBUtilSetBits has bug when ucNBits is zero */ + if (usNDiscrete != 0) + { + xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++], iRegBitIndex, + usNDiscrete, *pucRegBuffer++); + } + } + else + { + eStatus = MB_ENOREG; + } + + return eStatus; +} +#endif |
