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

📄 modbusslave.c

📁 modbus slave for rabot
💻 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 + -