MODBUS程序Word文档下载推荐.docx
- 文档编号:17420318
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:9
- 大小:47.65KB
MODBUS程序Word文档下载推荐.docx
《MODBUS程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《MODBUS程序Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
//允许T1中断
TR1=1;
//T1开始计数
}
voidtimer1()interrupt3using2//定时器中断
//3.646msinterrupt
if(rx_count>
=5)
//超时后,若接收缓冲区有数则判断为收到一帧
rx_ok=TRUE;
voidscomm()interrupt4using3
//modbusRTU模式
if(TI)
TI=0;
if(tx_count<
tx_number)
//是否发送结束
SBUF=txbuf[tx_count];
tx_count++;
if(RI)
rx_temp=SBUF;
if(rx_ok==FAULT)
//已接收到一帧数据,在未处理之前收到的数舍弃
if(rx_count
rxbuf[rx_count]=rx_temp;
rx_count++;
//timer1reset,countagain
RI=0;
在主循环中判断标志rx_ok来执行帧处理。
if(rx_ok)
ParseFrame();
KB0=1;
REN=0;
tx_count=0;
TI=1;
//启动发送响应帧
rx_count=0;
rx_ok=0;
WORDMAKEWORD(a,b)
int_byteitemp;
itemp.items.high=a;
itemp.items.low=b;
return(itemp.item);
//解析帧并发送响应帧(在帧完整的前提下调用)
bitParseFrame()
unsignedcharbyAddr;
//地址
unsignedcharbyFunCode;
//功能代码
int_bytewCRC;
wCRC.item=MAKEWORD(rxbuf[rx_count-1],rxbuf[rx_count-2]);
if(wCRC.item!
=CRC(rxbuf,rx_count-2))
//判断校验是否正确
returnFALSE;
//正式解析
byAddr=rxbuf[0];
byFunCode=rxbuf[1];
//如果地址不对
if((byAddr!
=m_byAddress)&
&
(byAddr!
=0))
if(byAddr==m_byAddress)
AddSendByte(m_byAddress);
switch(byFunCode)
case3:
//读保持寄存器
Fun3(3);
break;
....//添加命令散转
......
default:
ErroRespond
(1);
}
wCRC.item=CRC(txbuf,tx_number);
AddSendByte(wCRC.items.low);
AddSendByte(wCRC.items.high);
returnTRUE;
//根据接收帧模式发送相应,模式的数据
BOOLAddSendByte(constBYTEbyData)
txbuf[tx_number]=byData;
tx_number++;
if(tx_number>
30)returnFALSE;
//异常响应
描述
响应解释
//
01
无效功能
变送器不允许执行收到的功能
02
无效地址
数据栏中的地址是不允许的
03
无效数据
数据栏中的数据是不允许的
06
忙
收到的消息没错,但从机正在执行一个长的程序命令
bitErroRespond(constunsignedcharbyErroCode)
printf("
\nErroRespond%02X\n"
byErroCode);
if(!
AddSendByte(rxbuf[1]|0x80))
returnAddSendByte(byErroCode);
//***CRCCalculationforMODBUSProtocolforVC++***//
//数组snd为地址等传输字节,num为字节数//
unsignedintCRC(unsignedchar*snd,unsignedcharnum)
unsignedchari,j;
unsignedintc,crc=0xFFFF;
for(i=0;
i<
num;
i++)
c=snd[i]&
0x00FF;
crc^=c;
for(j=0;
j<
8;
j++)
{
if(crc&
0x0001)
crc>
>
=1;
crc^=0xA001;
elsecrc>
return(crc);
MODBUS协议—51端程序2
#include"
main.h"
/******************************
微控电子
modbusRTU的C51程序单片机89S52
通信波特率96008位数据1位停止位偶校验485通位接口
单片机控制板地址localAddr(变量)
通信可设置数据的地址:
字地址0-255(只取16位的低8位)
位地址0-255(只取16位的低8位)
*******************************/
uint32
dwTickCount,dwIntTick;
//时钟
uint8
idatasendBuf[16],receBuf[16];
//发送接收缓冲区
idatacheckoutError;
//==2偶校验错
idatareceTimeOut;
//接收超时
idatac10ms;
//10ms计时
bit
b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms;
//定时标志位
//串行中断程序
voidcommIntProc()interrupt4
if(sendPosi<
sendCount)
sendPosi++;
ACC=sendBuf[sendPosi];
TB8=P;
//加上校验位
SBUF=sendBuf[sendPosi];
else
b485Send=0;
//发送完后将485置于接收状态
receCount=0;
//清接收地址偏移寄存器
checkoutError=0;
elseif(RI)
RI=0;
receTimeOut=10;
//通讯超时值
receBuf[receCount]=SBUF;
ACC=receBuf[receCount];
if(P!
=RB8)
checkoutError=2;
//偶校验出错
receCount++;
//接收地址偏移寄存器加1
receCount&
=0x0f;
//最多一次只能接收16个字节
//voidCommIntProc()
//定时器01ms中断
voidtimer0IntProc()interrupt1
TL0=TIMER_LOW;
TH0=TIMER_HIGHT;
dwIntTick++;
bt1ms=1;
c10ms++;
if(c10ms>
=10)
c10ms=0;
//10ms计时器清零
bt10ms=1;
//voidTimer0IntProc()
//外部中断0
voidintEx0Proc(void)interrupt0
//计数器1中断
voidcounter1IntProc(void)interrupt3using1
//定时处理
voidtimeProc(void)
staticuint8c200ms;
bWatchDog=~bWatchDog;
//看门狗取反
b1ms=0;
b10ms=0;
b100ms=0;
ET0=0;
dwTickCount=dwIntTick;
ET0=1;
if(bt1ms)
bt1ms=0;
b1ms=1;
if(receTimeOut>
0)
receTimeOut--;
if(receTimeOut==0&
receCount>
0)
//判断通讯接收是否超时
//将485置为接收状态
//将接收地址偏移寄存器清零
if(bt100ms)
bt100ms=0;
b100ms=1;
if(bt10ms)
//判断中断10ms标志位是否1
bt10ms=0;
//清中断10ms标志位
b10ms=1;
c200ms++;
//200ms计时器加1
if(c200ms>
=20)
//判断是否计时到200ms
c200ms=0;
//清200ms计时器
bRunLED=~bRunLED;
//取反运行指示灯
//voidTimerProc(void)
//初始化串口
voidinitUart(void)
//T2用于波特率9600
T2CON=0x30;
RCAP2H=0xff;
RCAP2L=0xb8;
TR2=1;
//偶校验
SCON=0xd0;
PCON=0;
ES=1;
}//voidinitUart(void)
//初始化中断
voidinitInt(void)
TMOD=0x51;
TR0=1;
TH1=0;
//9600
TL1=0;
TR1=0;
//定时器1用于计数定时器2用于波特
ET1=1;
//PT1=1;
IT0=1;
IT1=1;
EX0=0;
PX0=1;
EX1=0;
initUart();
EA=1;
//voidinitInt(void)
//初始化
voidinitProg(void)
{
initInt();
voidmain(void)
initProg();
while
(1)
timeProc();
checkComm0Modbus();
集成运算放大器的分类:
按照集成运算放大器的参数来分,集成运算放大器可分为如下几种类型。
1.通用型运算放大器
通用型运算放大器就是以通用为目的而设计的。
这类器件的主要特点是价格低廉、产品量大面广,其性能指标能适合于一般性使用。
例ua741(单运放)、lm358(双运放)、lm324(四运放)及以场效应管为输入级的lf356都属于此种。
它们是目前应用最为广泛的集成运算放大器。
2.高阻型运算放大器
这类集成运算放大器的特点是差模输入阻抗非常高,输入偏置电流非常小,一般rid>(109~1012)w,iib为几皮安到几十皮安。
实现这些指标的主要措施是利用场效应管高输入阻抗的特点,用场效应管组成运算放大器的差分输入级。
用fet作输入级,不仅输入阻抗高,输入偏置电流低,而且具有高速、宽带和低噪声等优点,但输入失调电压较大。
常见的集成器件有lf356、lf355、lf347(四运放)及更高输入阻抗的ca3130、ca3140等。
3.低温漂型运算放大器
在精密仪器、弱信号检测等自动控制仪表中,总是希望运算放大器的失调电压要小且不随温度的变化而变化。
低温漂型运算放大器就是为此而设计的。
目前常用的高精度、低温漂运算放大器有op-07、op-27、ad508及由mosfet组成的斩波稳零型低漂移器件icl7650等。
4.高速型运算放大器
在快速a/d和d/a转换器、视频放大器中,要求集成运算放大器的转换速率sr一定要高,单位增益带宽bwg一定要足够大,像通用型集成运放是不能适合于高速应用的场合的。
高速型运算放大器主要特点是具有高的转换速率和宽的频率响应。
常见的运放有lm318、ua715等,其sr=50~70v/us,bwg>20mhz。
5.低功耗型运算放大器
由于电子电路集成化的最大优点是能使复杂电路小型轻便,所以随着便携式仪器应用范围的扩大,必须使用低电源电压供电、低功率消耗的运算放大器相适用。
常用的运算放大器有tl-022c、tl-060c等,其工作电压为±
2v~±
18v,消耗电流为50~250ma。
目前有的产品功耗已达微瓦级,例如icl7600的供电电源为1.5v,功耗为10uw,可采用单节电池供电。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MODBUS 程序