📄 modbusslave.c
字号:
/*****************************************************
Modbus Slave RTU / ASCII Terminal Software
by Kevin
******************************************************/
/*****************************************************
Revision History:
03/10/08
First C-program
Use version Ver 0.0
******************************************************/
//~~~~~~~~~~ #use library ~~~~~~~~~~~
#use "ms_rab.lib" //Dynamic C MODBus ASCII/RTU Slave
#use "msz_rab.lib" //MODBus Slave Serial Drivers for Rabbit 2000
//~~~~~~~~~~ #defineants ~~~~~~~~~~~
//define current software version.
#define SoftVersion "V 0.0"
//set serial baud rate
#define MODBUS_BAUDRATE 9600
//set slave address.
#define SLAVE_ADDRESS 0x01
// Choose the protocol type, 0 for ASCII, 1 for RTU.
#define MODBUS_TYPE 1
//select port # via sioX
#define sioX 1 //change this for other serial port
//1:serial port A; 2:serial port B; 3:serial port C
#if sioX==1 //serial port A declaration
#define INBUFSIZE 31
#define OUTBUFSIZE 31
#define serXopen serAopen
#define serXparity serAparity
#define serXwrFlush serAwrFlush
#define serXrdFlush serArdFlush
#define serXwrUsed serAwrUsed
#define serXrdUsed serArdUsed
#define serXputc serAputc
#define serXgetc serAgetc
#endif
#if sioX==2 //serial port B declaration
#define INBUFSIZE 31
#define OUTBUFSIZE 31
#define serXopen serBopen
#define serXparity serBparity
#define serXwrFlush serBwrFlush
#define serXrdFlush serBrdFlush
#define serXwrUsed serBwrUsed
#define serXrdUsed serBrdUsed
#define serXputc serBputc
#define serXgetc serBgetc
#endif
#if sioX==3 //serial port B declaration
#define INBUFSIZE 31
#define OUTBUFSIZE 31
#define serXopen serCopen
#define serXparity serCparity
#define serXwrFlush serCwrFlush
#define serXrdFlush serCrdFlush
#define serXwrUsed serCwrUsed
#define serXrdUsed serCrdUsed
#define serXputc serCputc
#define serXgetc serCgetc
#endif
//~~~~~~~~~~ Functions ~~~~~~~~~~~~~~
//~~~~~~~~~~ CoFunctions ~~~~~~~~~~~~
//~~~~~~~~~~ Variables ~~~~~~~~~~~~~~
//~~~~~~~~~~~~ Main() ~~~~~~~~~~~~~~
#class auto
void main(void)
{
//auto int loop;
brdInit(); //initialize the Rabbit
#if (!MODBUS_TYPE)
// Open Serial port X in ASCII mode
msaXinit(SLAVE_ADDRESS, MODBUS_BAUDRATE);
#else
// Open Serial port X in RTU mode
msrXinit(SLAVE_ADDRESS, MODBUS_BAUDRATE);
#endif
while(1)
{
msRun();
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Name: msaXinit
| Syntax: int msaXinit(unsigned wAddr, unsigned long qBand).
| Functionality: Initialize serial port X as a Modbus ASCII Slave.
| Parameter1: Slave address.
| Parameter2: baud rate (bits per second)
| Return Value: 1 if successful, 0 if unsupported baud rate.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
nodebug
int msaXinit (unsigned wAddr, unsigned qBaud)
{
msaInit(wAddr); //Init ASCII Bridge
return msXinit(qBaud); //Initializing serial port X as a Modbus ASCII Slave.
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Name: msrXinit
| Syntax: int msrXinit(unsigned wAddr, unsigned long qBand).
| Functionality: Initialize serial port X as a Modbus RTU Slave.
| Parameter1: Slave address.
| Parameter2: baud rate (bits per second)
| Return Value: 1 if successful, 0 if unsupported baud rate.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
nodebug
int msrXinit(unsigned wAddr, unsigned qBaud)
{
msrInit(wAddr,1+35000u/qBaud);
return msXinit(qBaud); //Initializing serial port X as a Modbus ASCII Slave.
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Name: msXinit
| Syntax: int msXinit(unsigned long qBand).
| Functionality: Initializing serial port X as a Modbus ASCII Slave.
| Parameter1: baud rate (bits per second)
| Return Value: 1 if successful, 0 if unsupported baud rate.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
nodebug
int msXinit(unsigned qBaud)
{
serXopen(qBaud); //Open the serial port.
//setup parity. Either PARAM_OPARITY, PARAM_EPARITY, PARAM_NOPARITY, or PARAM_2STOP
serXparity(PARAM_EPARITY);
//setup data bits. Either PARAM_7BIT, or PARAM_8BIT.
serXdatabits(PARAM_8BIT);
return(1);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Name: msXtx
| Syntax: void msXtx().
| Functionality: Enable the RS485 transmitter.
| Parameter1:
| Return Value:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void msXtx()
{
ser485Tx(); //Turn on the transmitter.
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Name: msXrx
| Syntax: void msXrx().
| Functionality: Disable the RS485 transmitter.
| Parameter1:
| Return Value:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void msXrx()
{
// Make sure all of the data has been sent by;
// 1.) checking the write buffer for any bytes left
// 2.) checking the status of the Write interrupt transmit bit (2).
// 3.) checking the status of the Write interrupt data bit (3)
while (serXwrUsed() || BitRdPortI(SDSR,2) || BitRdPortI(SDSR,3));
// turn off the transmitter
ser485Rx();
// Since we echo what we send, flush the read buffer, so that you are
// ready for the next packet.
serXrdFlush();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -