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

📄 protomod.h

📁 build a modbus client/server for use on the Protocessor (from FieldServer Technologies) Tools Req
💻 H
字号:
/*******************************************************************************

Written by:  Haemish Kyd

      It is hereby certified that the author of this code specified above
      has made reference only to information that is in the public domain
      or is available to FieldServer Technologies via a duly signed
      Non-Disclosure Agreement. This code is guaranteed free and clear of
      any claim upon it by any Third Party.

      The basis for this certification includes:
         Original work performed by Eddie Hague.

   Copyright (c) 1991-2003, FieldServer Technologies.
   1991 Tarob Court, Milpitas, CA 95035, USA
   (408) 262 2299

********************************************************************************

 Versions
  1.00aA   15 Oct 04 HLK   Created

*******************************************************************************/

#define OPTION_SERVER
#define DIAGNOSTICS 'N'
#ifdef TARGET_LINT
   #define rom
#endif

/******************************************************************/
/*       MESSAGE STATES (WHILE RECEIVING)                         */
/******************************************************************/
#define CMPLT_COMPLETE  0x01
#define CMPLT_HOPE      0x02
#define CMPLT_NO_HOPE   0x03

/******************************************************************/
/*       MODBUS PARAMETERS                                        */
/******************************************************************/
#define MODBUS_NODE_ID  2

#define MB_POLL_TIMEOUT 1000
#define MB_POLL_DELAY   500

/******************************************************************/
/*       USEFUL DEFINITIONS                                       */
/******************************************************************/
#ifndef NOREF
   #define NOREF(a)     (a=a)
#endif

#define kick_watchdog   ClrWdt

#define max(a,b)            (((a) > (b)) ? (a) : (b))
#define min(a,b)            (((a) < (b)) ? (a) : (b))

/******************************************************************/
/*      MODBUS FUNCTION CODES                                     */
/******************************************************************/
#define MODBUS_READ_COILS               0x01
#define MODBUS_READ_DISCRETEINPUTS      0x02
#define MODBUS_READ_INPUTREGISTERS      0x04
#define MODBUS_WRITE_COIL               0x05
#define MODBUS_WRITE_REGISTER           0x06
#define MODBUS_WRITE_MULT_REG           0x10
#define MODBUS_WRITE_MULT_COIL          0x0F
#define EX_MODBUS_READ_COILS            0x81
#define EX_MODBUS_READ_DISCRETEINPUTS   0x82
#define EX_MODBUS_READ_INPUTREGISTERS   0x84
#define EX_MODBUS_WRITE_COIL            0x85
#define EX_MODBUS_WRITE_REGISTER        0x86
/******************************************************************/
/*      OTHER MODBUS #DEFINES                                     */
/******************************************************************/
#define MX_RX_TX_BUFFERSIZE         20
#define ILLEGAL_DATA_ADDRESS        02
#define ILLEGAL_DATA_VALUE          03
#define BYTE_SIZE                   8
#define COIL_ON                     0xFF00
#define COIL_OFF                    0x0000
#define ON                          TRUE
#define OFF                         FALSE
#define MX_COILS                    8
#define MX_DI                       9
#define MX_REG                      8
#define MX_DATA_ARRAY               100
#define WRITE_COIL_RESPONSE_LENGTH  6
#define READ                        0x01
#define WRITE                       0x02

/******************************************************************/
/*       MAP DESCRIPTOR STRUCTURE                                 */
/******************************************************************/

typedef struct
   {
   BYTE    reference ;
   UINT16  address ;
   BYTE    function;
   UINT16  data;
   UINT16  old_data;
   BYTE    offset;
   BYTE    node_id;

   } MAP_DESC_TYP ;

typedef struct
   {
   BYTE    *buf ;
   BYTE    length ;

   } RESPONSE_TYP ;

typedef struct
   {
   BYTE    function ;
   BYTE    node_id ;
   UINT16  address;
   UINT16  length;
   UINT16  data;
   UINT16  checksum;

   } IN_BUF_TYP ;

/******************************************************************/
/*       ENUMS FOR COILS                                          */
/******************************************************************/

enum
   {

   COIL_1,
   COIL_2,
   COIL_3,
   COIL_4,
   COIL_5,
   COIL_6,
   COIL_7,
   COIL_8

   } ;

/******************************************************************/
/*       ENUMS FOR DISCRETE INPUTS                                */
/******************************************************************/
enum
   {
   DI_1       ,
   DI_2       ,
   DI_3       ,
   DI_4       ,
   DI_5       ,
   DI_6       ,
   DI_7       ,
   DI_8       ,
   DI_9
   } ;


/******************************************************************/
/*       ENUMS FOR REGISTERS                                      */
/******************************************************************/
enum
   {
   REG_1      ,
   REG_2      ,
   REG_3      ,
   REG_4      ,
   REG_5      ,
   REG_6      ,
   REG_7      ,
   REG_8
   };

/******************************************************************/
/*       PROTOTYPES                                               */
/******************************************************************/

VOID     Init_Variables ( VOID ) ;
VOID     modbus_init ( VOID ) ;
BYTE     ReadEeprom ( INT EEPROM_Address) ;
VOID     WriteEeprom ( INT addr, BYTE val) ;
VOID     ToggleLed ( VOID ) ;
VOID     application_start ( VOID ) ;
VOID     application_idle ( VOID ) ;
VOID     Delay_1s( VOID ) ;
VOID     Delay_ms ( BYTE param ) ;
VOID     Delay_50us(BYTE microsec50) ;
VOID     InitHardware ( VOID ) ;
VOID     idle_modbus(VOID);

/******************************************************************/
/*       MODBUS PROTOTYPES                                        */
/******************************************************************/
VOID     build_and_submit_modbus_write_poll (BYTE node_id, UINT16 address, BYTE function, INT16 write_val );
VOID     build_and_submit_modbus_read_poll  (BYTE node_id, UINT16 address, BYTE function, BYTE amount ) ;
VOID     get_PICUART_data (VOID);
VOID     clr_rx (VOID);
VOID     WritePICUART(const BYTE *buf, BYTE length);
BYTE     modbusPacketResponseComplete ( VOID ) ;
UINT16   modrtuChecksum ( BYTE *chkbuf, BYTE len );
BYTE     modbusCheckAddress( VOID );
VOID     modbusGiveUpCharacter( VOID );
BYTE     modbusPollReceiveComplete ( VOID );
VOID     modbusRespond ( MAP_DESC_TYP *temp_md );
MAP_DESC_TYP *check_for_next_modbus_message ( VOID );
VOID     poll_modbus( MAP_DESC_TYP *temp_md );
VOID     parse_reponse_and_store_data ( VOID );
BYTE      UARTIntGetChar(BYTE*) ;
BYTE     UARTIntGetRxBufferDataSize(VOID) ;
VOID     UARTIntInit (VOID) ;
BYTE     modbusParseMessage( VOID );
MAP_DESC_TYP *modbusFetchData( VOID );
MAP_DESC_TYP *modbusStoreData( VOID );
MAP_DESC_TYP *store_data_to_data_array(BYTE function,UINT16 address,UINT16 data);
MAP_DESC_TYP *find_map_desc_with_data(BYTE function,UINT16 address);

/******************************************************************/
/*       DATA ACCESS API                                          */
/******************************************************************/
VOID     da_put_UINT16(MAP_DESC_TYP *temp_md,UINT16 value);
VOID     da_put_BIT(MAP_DESC_TYP *temp_md,UINT16 value);
VOID     da_get_BIT(MAP_DESC_TYP *temp_md);
VOID     da_get_UINT16(MAP_DESC_TYP *temp_md);
VOID     init_da( VOID );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -