亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mm_rab.lib

?? modbus 運用事例
?? LIB
?? 第 1 頁 / 共 4 頁
字號:
PARAMETER2: starting 0X coil number (zero based).
PARAMETER3: coils count (one based).
PARAMETER4: binary states (OFF == 0, ON == 1) buffer pointer.

RETURN VALUE: 0 (MM_BUSY) if busy, -1 (MM_OK) if success, or exception
code (from master if < -1 or from slave if > 0). See the MM_* and MS_*
definitions near the start of MM_RAB.LIB for the complete list.
END DESCRIPTION ******************************************************/

nodebug
int mmForceCoils(unsigned wAddr, unsigned wCoil, unsigned wCount,
                 void *pCoils)
{
	auto int nErr;

	nErr = MM_BUSY;
	costate
	{
		mmCmdNew(wAddr, 0x0F);										//	Start New Command
		mmCmdWord(wCoil);												//	Coil Address
		mmCmdWord(wCount);											//	Coil Count
		mmCmdByte((unsigned char) ((wCount>>3) & 0xFF));	//	Byte Count
		while(wCount--)												//	Coil Data
			mmCmdByte(*((unsigned char *) pCoils)++);
		waitfor(nErr = mmExec());									//	Finish&Exec Packet
	}
	return nErr;
}

/*=========================================================================*\
	[0x10] Preset Multiple Registers
\*=========================================================================*/

/*** BeginHeader mmPresetRegs */
int mmPresetRegs(unsigned,unsigned,unsigned,void *);
/*** EndHeader */

/* START FUNCTION DESCRIPTION *****************************************
mmPresetRegs                  <MM_RAB.LIB>

NOTE: MM_RAB.LIB functions are generally not reentrant.

SYNTAX: int mmPresetRegs(unsigned wAddr, unsigned wReg,
                         unsigned wCount, void *pRegs)

DESCRIPTION: Modbus Master query 0x10, Preset Multiple Registers.
Presets the contents of the selected registers (4X references) with
values from the buffer pointed to by *pRegs, 16-bits per register with
the starting register number at the beginning of the buffer. The buffer
size should be no less than 'wCount * 2' bytes. When broadcast, this
function presets the same register references in all attached slave
devices.

PARAMETER1: slave address, broadcast (0x00) is supported.
PARAMETER2: starting 4X register number (zero based).
PARAMETER3: registers count (one based).
PARAMETER4: preset values buffer pointer.

RETURN VALUE: 0 (MM_BUSY) if busy, -1 (MM_OK) if success, or exception
code (from master if < -1 or from slave if > 0). See the MM_* and MS_*
definitions near the start of MM_RAB.LIB for the complete list.
END DESCRIPTION ******************************************************/

nodebug
int mmPresetRegs(unsigned wAddr, unsigned wReg, unsigned wCount,
                 void *pRegs)
{
	auto int nErr;

	nErr = MM_BUSY;
	costate
	{
		mmCmdNew(wAddr, 0x10);									// Start New Command
		waitfor(nErr = mmRegWr(wReg, wCount, pRegs));	// Finish & Exec Packet
	}
	return nErr;
}

/*=========================================================================*\
	[0x16] Mask Write 4X Register
\*=========================================================================*/

/*** BeginHeader mmRegMask */
int mmRegMask(unsigned,unsigned,unsigned,unsigned);
/*** EndHeader */

/* START FUNCTION DESCRIPTION *****************************************
mmRegMask                     <MM_RAB.LIB>

NOTE: MM_RAB.LIB functions are generally not reentrant.

SYNTAX: int mmRegMask(unsigned wAddr, unsigned wReg, unsigned wAnd,
                      unsigned wOr)

DESCRIPTION: Modbus Master query 0x16, Mask Write 4X Register. Modifies
the contents of the specified holding register (4X reference) by the
following algorithm: 4X[wReg] = (4X[wReg] & wAnd) | (wOr & ~wAnd). If
the wOr value is zero then the result is: 4X[wReg] = 4X[wReg] & wAnd.
If the wAnd value is zero then the result is: 4X[wReg] = wOr. This
function is used to set or clear individual bits in the register,
without the possibility of corrupting other register bits that might be
solved in the slave device in the mean-time between a read register
query and a subsequent write register query.

PARAMETER1: slave address, broadcast (0x00) is not supported.
PARAMETER2: 4X register number (zero based).
PARAMETER3: AND mask value (16-bit binary).
PARAMETER4: OR mask value (16-bit binary).

RETURN VALUE: 0 (MM_BUSY) if busy, -1 (MM_OK) if success, or exception
code (from master if < -1 or from slave if > 0). See the MM_* and MS_*
definitions near the start of MM_RAB.LIB for the complete list.
END DESCRIPTION ******************************************************/

nodebug
int mmRegMask(unsigned wAddr, unsigned wReg, unsigned wAnd,
              unsigned wOr)
{
	auto int nErr;

	if(!wAddr)
	{
		nErr = MM_NOBROAD;				//	Broadcast Not Supported
	}
	else
	{
		nErr = MM_BUSY;
		costate
		{
			mmCmdNew(wAddr, 0x16);		//	Start New Command
			mmCmdWord(wReg);				//	Register Address
			mmCmdWord(wAnd);				//	And Mask
			mmCmdWord(wOr);				//	Or Mask
			waitfor(nErr = mmExec());	//	Finish & Execute Packet
		}
	}
	return nErr;
}

/*=========================================================================*\
	[0x17] Read/Write 4X Registers
\*=========================================================================*/

/*** BeginHeader mmRegRdWr */
int mmRegRdWr(unsigned,unsigned,unsigned,void *,unsigned,unsigned,
              void *);
/*** EndHeader */

/* START FUNCTION DESCRIPTION *****************************************
mmRegRdWr                     <MM_RAB.LIB>

NOTE: MM_RAB.LIB functions are generally not reentrant.

SYNTAX: int mmRegRdWr(unsigned wAddr, unsigned wRdReg, unsigned wRdCnt,
                      void *pRd, unsigned wWrReg, unsigned wWrCnt,
                      void *pWr)

DESCRIPTION: Modbus Master query 0x17, Read/Write 4X Registers.
Performs one registers read and one registers write operation (all 4X
references) in a single transaction. The function writes new contents
into one group of registers, then reads the contents of another group
of registers. Presets the contents of the selected write registers with
values from the buffer pointed to by *pWr, 16-bits per register with
the starting register number at the beginning of the write buffer. The
write buffer size should be no less than 'wWrCnt * 2' bytes. Places the
present contents of the selected read registers into the buffer pointed
to by *pRd, 16-bits per register with the starting register number at
the beginning of the read buffer. The read buffer size should be no
less than 'wRdCnt * 2' bytes.

PARAMETER1: slave address, broadcast (0x00) is not supported.
PARAMETER2: starting 4X read register number (zero based).
PARAMETER3: read registers count (one based).
PARAMETER4: read registers information buffer pointer.
PARAMETER5: starting 4X write register number (zero based).
PARAMETER6: write registers count (one based).
PARAMETER7: write registers values buffer pointer.

RETURN VALUE: 0 (MM_BUSY) if busy, -1 (MM_OK) if success, or exception
code (from master if < -1 or from slave if > 0). See the MM_* and MS_*
definitions near the start of MM_RAB.LIB for the complete list.
END DESCRIPTION ******************************************************/

nodebug
int mmRegRdWr(unsigned wAddr, unsigned wRdReg, unsigned wRdCnt,
              void *pRd, unsigned wWrReg, unsigned wWrCnt,
              void *pWr)
{
	auto int nErr;

	if(!wAddr)
	{
		nErr = MM_NOBROAD;											// No Broadcast
	}
	else
	{
		nErr = MM_BUSY;
		costate
		{
			mmCmdNew(wAddr, 0x17);									// Start New Command
			mmCmdWord(wRdReg);										// Read Register Addr
			mmCmdWord(wRdCnt);										// Read Register Count
			waitfor(nErr = mmRegWr(wWrReg, wWrCnt, pWr));	// Finish&Exec Packet
			if(nErr == MM_OK)											// Process Reply if OK
				mmRegExt(pRd);
		}
	}
	return nErr;
}

/***************************************************************************\
	MODBus ASCII Master Packet Processing
\***************************************************************************/

/*** BeginHeader mmaInit */
void mmaInit();

// additional function prototypes for Modbus ASCII
unsigned mmLRC(unsigned char *,unsigned);
int mmExec();
/*** EndHeader */

/*=========================================================================*\
	Compute Longitude Redundancy Check
\*=========================================================================*/

nodebug
unsigned mmLRC(unsigned char *pcMess, unsigned wLen)
{
	auto unsigned char cSum;

	for(cSum = 0; wLen--; cSum += *pcMess++);
	return cSum;
}

/*=========================================================================*\
	Assemble MODBus ASCII Packet & Process when Done
\*=========================================================================*/

#ifndef MM_BRTO
#define MM_BRTO 1000L	// default ASCII Begin Reply Time Out (mS)
#endif

#ifndef MM_ERTO
#define MM_ERTO 1000L	// default ASCII End Reply Time Out (mS)
#endif

const unsigned char acHex[] = "0123456789ABCDEF";
unsigned char acMMM[516];

nodebug
int mmExec()
{
	auto unsigned char *pcHex;
	auto unsigned char *pcCmd;
	auto unsigned char *pcM; 
	static unsigned char *pcRep;
	static unsigned wCnt;
	auto unsigned wLRC;
	static int nByte;
	auto int nErr;

	nErr = MM_BUSY;

	costate
	{
		wLRC = -mmLRC(acMMCmd,pcMMCmd-acMMCmd) & 0xFF;	// get ASCII LRC
		
		// convert query to Modbus ASCII format with appended LRC
		pcM = acMMM;
		*pcM++ = ':';
		for(pcCmd = acMMCmd; pcCmd < pcMMCmd; ++pcCmd)
		{
			*pcM++ = acHex[*pcCmd >> 4];
			*pcM++ = acHex[*pcCmd & 15];
		}
		*pcM++ = acHex[wLRC >> 4];
		*pcM++ = acHex[wLRC & 15];
		*pcM++ = '\r';
		*pcM++ = '\n';
		*pcM = '\0';

		while(mmRecv() != -1);						// clean out receive buffer
		mmSend(NULL, 0);								// clean out transmit buffer
		waitfor(mmSend(acMMM, pcM - acMMM));	// send Modbus ASCII query

		// clear out response buffer (extra time for response to begin)
		memset(acMMRep, 0, sizeof(acMMRep));

		if(acMMCmd[0] == 0x00)
		{
			// broadcast command, no slave response expected
			nErr = MM_OK;
			abort;
		}

		// look for ASCII response's initial COLON
		nByte = -1;	// protect against immediate time out
		do
		{
			waitfor(DelayMs(MM_BRTO) || ((nByte = mmRecv()) != -1));
		} while((nByte != -1) && (nByte != ':'));

		if(nByte == -1)
		{
			// no response
			nErr = MM_TIMEOUT;
			abort;
		}

		// collect ASCII response up to the CR
		pcRep = acMMRep;
		for(wCnt = 0; wCnt < sizeof(acMMRep); wCnt++)
		{
			// either response end CR or first byte of hex-digit pair
			nByte = -1;	// protect against immediate time out
			waitfor(DelayMs(MM_ERTO) || ((nByte = mmRecv()) != -1));
			if(nByte == '\r')
			{
				// go check for response end LF after CR
				break;
			}
			if(nByte == -1)
			{
				// incomplete response
				nErr = MM_TIMEOUT;
				abort;
			}
			if(!(pcHex = strchr(acHex, nByte)))
			{
				// illegal character
				nErr = MM_GARBAGE;
				abort;
			}
			*pcRep = (pcHex - acHex) << 4;

			// second byte of hex-digit pair
			nByte = -1;	// protect against immediate time out
			waitfor(DelayMs(MM_ERTO) || ((nByte = mmRecv()) != -1));
			if(nByte == -1)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久99| 久久品道一品道久久精品| 国产精品久久777777| 丁香六月久久综合狠狠色| 国产精品私人影院| 成人一区二区三区| 国产精品免费视频观看| 99久久精品国产麻豆演员表| 一区二区三区欧美日| 91.xcao| 久久丁香综合五月国产三级网站 | ㊣最新国产の精品bt伙计久久| 福利电影一区二区| 18欧美亚洲精品| 91麻豆精品国产91久久久更新时间| 人禽交欧美网站| 日本一区二区三区在线观看| 99v久久综合狠狠综合久久| 一区二区视频在线| 欧美一区二区三区四区高清| 国内精品久久久久影院一蜜桃| 中文字幕精品—区二区四季| 在线亚洲一区二区| 麻豆一区二区99久久久久| 国产欧美一区二区在线| 色av成人天堂桃色av| 丝袜亚洲另类欧美综合| 欧美高清在线一区| 在线观看中文字幕不卡| 国模套图日韩精品一区二区| 一区二区三区中文字幕| 欧美精品一区二区三区在线| 色偷偷88欧美精品久久久| 免费美女久久99| 一区二区三区中文字幕在线观看| 亚洲精品一区二区三区四区高清 | 北条麻妃一区二区三区| 亚洲成人在线观看视频| 国产欧美一区二区三区在线老狼| 欧美日韩午夜在线| 高清国产午夜精品久久久久久| 日韩精品一二三| 1024精品合集| 久久久久久久性| 7878成人国产在线观看| 亚洲欧洲色图综合| 成人精品小蝌蚪| 一区二区三区欧美激情| 91精品中文字幕一区二区三区| 青青草精品视频| 精品国产不卡一区二区三区| 成人激情校园春色| 一区二区三区不卡视频 | eeuss影院一区二区三区| 欧美日韩一区在线观看| 久久99精品久久久久久动态图| 亚洲综合男人的天堂| 最新高清无码专区| 久久精品人人做人人综合| 欧美一级日韩免费不卡| 欧美视频一区二区三区在线观看| 99久久婷婷国产精品综合| 国产精品资源在线看| 老汉av免费一区二区三区| 午夜精品视频一区| 久久99久久99| 日韩精品三区四区| 亚洲国产sm捆绑调教视频| 亚洲视频一二区| 国产午夜一区二区三区| 久久免费偷拍视频| 2023国产精华国产精品| 久久综合99re88久久爱| 欧美一区二区三区四区五区 | 日韩国产一二三区| 天天操天天干天天综合网| 亚洲国产成人高清精品| 亚洲成人激情自拍| 天堂一区二区在线免费观看| 亚洲福利一区二区| 亚洲妇熟xx妇色黄| 日本欧美一区二区在线观看| 日韩经典中文字幕一区| 蜜臀久久99精品久久久久久9| 琪琪久久久久日韩精品| 久久99精品久久久久| 国产一区视频导航| 国产成人精品aa毛片| 成人一道本在线| 色婷婷av一区二区三区gif| 欧美中文字幕一区| 91精品国产色综合久久不卡蜜臀| 欧美一区二区视频网站| 日韩美一区二区三区| 国产农村妇女毛片精品久久麻豆| 国产精品久久久久久久久免费相片| 日韩码欧中文字| 亚洲国产日韩a在线播放| 麻豆一区二区三| 国产一区二区在线视频| 成人激情动漫在线观看| 91官网在线观看| 欧美一区二区三区色| 精品欧美乱码久久久久久| 久久精品在线观看| 日韩美女久久久| 蜜桃视频在线一区| 99久久综合99久久综合网站| 欧美综合一区二区| 日韩一级免费观看| 国产精品久久久久影院老司| 丝袜亚洲另类欧美| 国产色综合一区| 日韩三级电影网址| 日韩女优av电影| 51久久夜色精品国产麻豆| 7777精品伊人久久久大香线蕉| 在线电影欧美成精品| 欧美日韩国产一二三| 欧美精品日日鲁夜夜添| 欧美一区二区三区色| 欧美不卡一二三| 国产午夜精品一区二区三区嫩草| 国产欧美日韩在线视频| 色菇凉天天综合网| 精品美女一区二区三区| 一区二区三区中文在线观看| 国产精品一区二区无线| 欧美日韩国产大片| 国产精品伦一区二区三级视频| 喷水一区二区三区| 99re这里只有精品首页| 欧美区视频在线观看| 国产精品进线69影院| 午夜久久电影网| 一本到不卡免费一区二区| 久久久久久亚洲综合| 日韩主播视频在线| 色网综合在线观看| 国产女人aaa级久久久级| 麻豆精品在线观看| 欧美日韩一区三区四区| 亚洲欧美日韩国产综合在线| 国产乱人伦精品一区二区在线观看 | 成人免费毛片片v| 欧美一区二视频| 亚洲一区二区美女| av男人天堂一区| 久久久久久**毛片大全| 日本中文字幕一区| 欧美三级韩国三级日本一级| 成人欧美一区二区三区小说| 粉嫩aⅴ一区二区三区四区| 欧美一区二区视频网站| 午夜伊人狠狠久久| 欧美日韩免费电影| 亚洲国产一区视频| 欧美三级日韩三级国产三级| 亚洲一区二区成人在线观看| 成人av网址在线| 中文字幕av一区二区三区高 | 亚洲福利一区二区三区| 91传媒视频在线播放| 亚洲欧美一区二区三区孕妇| 不卡一区中文字幕| 中文字幕精品综合| 成人精品在线视频观看| 日本一区二区电影| 国产成人免费高清| 国产精品久久久久影院老司 | 豆国产96在线|亚洲| 国产拍揄自揄精品视频麻豆| 国产成人在线看| 国产欧美视频一区二区三区| 菠萝蜜视频在线观看一区| 国产亚洲综合在线| 成人丝袜18视频在线观看| 国产精品三级电影| 91日韩在线专区| 亚洲激情欧美激情| 欧美伦理影视网| 久久精品国产99久久6| 久久影院午夜论| 不卡一区二区中文字幕| 亚洲视频图片小说| 欧美日韩高清影院| 久久99国产精品尤物| 日本一区二区综合亚洲| 91免费观看在线| 日韩一区二区在线看| 亚洲黄色小视频| 99精品一区二区三区| 国产精品久久国产精麻豆99网站| 国产精品资源网| 久久夜色精品国产欧美乱极品| 九九热在线视频观看这里只有精品| 欧美电影一区二区三区| 日韩二区三区四区| 日韩一区二区三区视频在线| 日韩成人精品在线观看|