51单片机与三菱PLC RS485通讯实例
51单片机实现的485通讯程序

标签:modbus8051源程序modbus协议--51端程序的实现RTU需要一个定时器来判断3.5个流逝时间。
#define ENABLE 1#define DISABLE 0#define TRUE 1#define FAULT 0#define RECEIVE_EN 0#define TRANSFER_EN 1#define MAX_RXBUF 0x20extern unsigned char emissivity;extern unsigned char tx_count,txbuf[15];extern unsigned char rx_count,rxbuf[15];extern unsigned char tx_number,rx_number;extern bit rx_ok;unsigned char rx_temp;void InitTimer1() //针对标准8051{TMOD=(TMOD|0xf0)&0x1f; //将T1设为16位定时器TF1=0;TH1=0x62; //设T1位3.5位的接收时间35bit/9600bit/s=3.646msTL1=0x80;//晶振为11.0592MHz,T=65535-3.646ms*11.0592MHz/12=0xf2df//0x6280是22.1184M下LPC9XX下的值。
ET1=1;//允许T1中断TR1=1;//T1开始计数}void timer1() interrupt 3 using 2 //定时器中断{TH1=0x62; //3.646ms interruptTL1=0x80;if(rx_count>=5) //超时后,若接收缓冲区有数则判断为收到一帧{rx_ok=TRUE;}}void scomm() interrupt 4 using 3 //modbus RTU模式{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_countrxbuf[rx_count]=rx_temp;rx_count++;}TH1=0x62; //timer1 reset,count againTL1=0x80;RI=0;}}在主循环中判断标志rx_ok来执行帧处理。
三菱plc与变频器485通讯程序实例

三菱plc与变频器485通讯程序实例
本例⼦是三菱PLC主机上装RS-485BD通讯适配器与变频器的485PU⼝相连接,通过三菱PLC 和三菱变频器之间的RS485半双⼯串⾏通讯来实现电动机的变频调速。
三菱PLC和三菱变频器之间进⾏通讯,通讯规格必须在变频器的初始化中设定,如果没有进⾏设定或有⼀个错误的设定,数据将不能进⾏通讯。
且每次参数设定后,需复位变频器。
确保参数的设定⽣效,设定好参数后按如下协议进⾏数据通讯。
该过程分5个阶段:
1、计算机发出通讯请求;
2、变频器处理等待;
3、变频器作出应答;
4、计算机处理等待;
5、计算机作出应答。
根据不同的通讯要求完成相应的过程,如写变频器启、停控制命令时则只需完成1-3三个过程;监视变频器运⾏频率时则需完成1-5五个过程。
不论是写数据还是读数据,均有PLC发出请求,变频器只是被动接受请求并作出应答。
每个阶段的数据格式均有差别。
现只列出较为常⽤的三种格式:
要实现三菱PLC对三菱变频器的通讯控制,必须对三菱PLC进⾏编程;通过程序实现PLC对变频器的各种运⾏控制和数据的采集。
三菱PLC程序⾸先应完成FX2N-485BD通讯适配器的初始化、控制命令字的组合、代码转换和变频器应答数据的处理⼯作。
PLC通过RS-485通讯控制变频器可以完成⼀台乃⾄多台变频器的启动、停⽌、频率设定。
硬件连接如图5所⽰。
由于每台变频器的通讯编程⽅法基本相似,唯⼀的不同之处就是变频器的站号设置不同。
PLC资料:三菱PLC RS485通讯使用教程(带示例)

通信
一、联机方式
自动化生产线各工作站中PLC之间通过RS-485串行通信的方式实现互连,构成分布式的控制系统。
二、N:N网络功能
N:N网络功能,就是在最多8台FX可编程控制器之间,通过RS-485通信连接,进行软元件相互连接。
1)根据要链接的点数,有3种模式可以选择。
2)数据的链接是在最多8台FX可编程控制器之间自动更新。
3)总延长距离最大可达500m。
三、链接模式及链接点数
四、N:N网络接线图
五、N:N网络中使用的软元件如下:
1.N:N网络设定用的软元件
是用于设定N:N网络的软元件。
使用N:N网络时,必须设定下列的软元件。
2.判断N:N网络错误用的元件
用于判断N:N网络错误。
请将链接错误输出到外部,并在顺控程序的互锁等中使用。
3. 链接软元件
是用于发送接收各可编程控制器之间的信息的软元件。
根据在相应站号设定中设定的站号,以及在刷新范围设
定中设定的模式不同,使用的软元件编号及点数也有所不同。
1)模式0时
2) 模式1时
3) 模式2时
三菱PLC 485通讯示例(2个PLC)
题目:
按下SB1(0#PLC 的X0),灯L1(1#PLC 的Y0)亮。
按下SB2(1#PLC 的X1),灯L2(0#PLC 的Y1)亮。
通讯线连接方式:
主站程序:
从站程序:。
三菱FX系列PLC与变频器通讯应用实例(RS485)

①三菱PLC:FX2N + FX2N-485-BD②三菱变频器:A500系列、E500系列、F500系列、F700系列、S500系列两者之间通过网线连接(网线的RJ45插头和变频器的PU插座接),使用两对导线连接,即将变频器的SDA与PLC通讯板(FX2N-485-BD)的RDA接,变频器的SDB与PLC通讯板(FX2N-485-BD)的RDB接,变频器的RDA与PLC通讯板(FX2N-485-BD)的SDA接,变频器的RDB与PLC通讯板(FX2N-485-BD)的SDB接,变频器的SG与PLC通讯板(FX2N-485-BD)的SG接。
A500、F500、F700系列变频器PU端口:E500 、S500 系列变频器PU 端口:一.三菱变频器的设置PLC和变频器之间进行通讯,通讯规格必须在变频器的初始化中设定,如果没有进行初始设定或有一个错误的设定,数据将不能进行传输。
注:每次参数初始化设定完以后,需要复位变频器。
如果改变与通讯相关的参数后,变频器没有复位,通讯将不能进行。
参数号名称设定值说明Pr.117 站号0 设定变频器站号为0Pr.118 通讯速率96 设定波特率为9600bpsPr.119 停止位长/数据位长11 设定停止位2位,数据位7位Pr.120 奇偶校验有/无2 设定为偶校验Pr.121 通讯再试次数9999 即使发生通讯错误,变频器也不停止Pr.122 通讯校验时间间隔9999 通讯校验终止Pr.123 等待时间设定9999 用通讯数据设定Pr.124 CR,LF有/无选择0 选择无CR,LF对于122号参数一定要设成9999,否则当通讯结束以后且通讯校验互锁时间到时变频器会产生报警并且停止(E.PUE)。
对于79号参数要设成1,即PU操作模式。
注:以上的参数设置适用于A500、E500、F500、F700系列变频器。
当在F500、F700系列变频器上要设定上述通讯参数,首先要将Pr.160设成0。
三菱fx系列plc与三菱变频器通讯应用实例(rs485)

三菱FX系列PLC与三菱变频器通讯应用实例(RS485)三菱电机自动化(上海)巢晓阳 2005-01-10对象:①三菱PLC:FX2N + FX2N-485-BD②三菱变频器:A500系列、E500系列、F500系列、F700系列、S500系列两者之间通过网线连接(网线的RJ45插头和变频器的PU插座接),使用两对导线连接,即将变频器的SDA与PLC通讯板(FX2N-485-BD)的RDA接,变频器的SDB与PLC通讯板(FX2N-485-BD)的RDB接,变频器的RDA与PLC通讯板(FX2N-485-BD)的SDA 接,变频器的RDB与PLC通讯板(FX2N-485-BD)的SDB接,变频器的SG与PLC通讯板(FX2N-485-BD)的SG接。
A500、F500、F700系列变频器PU端口:E500、S500系列变频器PU端口:一.三菱变频器的设置PLC和变频器之间进行通讯,通讯规格必须在变频器的初始化中设定,如果没有进行初始设定或有一个错误的设定,数据将不能进行传输。
注:每次参数初始化设定完以后,需要复位变频器。
如果改变与通讯相关的参数后,变频器没有复位,通讯将不能进行。
参数号名称设定值说明Pr.117 站号 0 设定变频器站号为0Pr.118 通讯速率 96 设定波特率为9600bpsPr.119 停止位长/数据位长 11 设定停止位2位,数据位7位Pr.120 奇偶校验有/无 2 设定为偶校验Pr.121 通讯再试次数 9999 即使发生通讯错误,变频器也不停止Pr.122 通讯校验时间间隔 9999 通讯校验终止Pr.123 等待时间设定 9999 用通讯数据设定Pr.124 CR,LF有/无选择 0 选择无CR,LF对于122号参数一定要设成9999,否则当通讯结束以后且通讯校验互锁时间到时变频器会产生报警并且停止(E.PUE)。
对于79号参数要设成1,即PU操作模式。
注:以上的参数设置适用于A500、E500、F500、F700系列变频器。
51单片机串口485通讯程序

/* 以下为单片机串口485通讯程序,从机程序(当然也适用于主机程序),主机发送可以先用串口帮手软件来调试,经过Keil uVision4实际测试,测试效果如结尾图片所示, 大部分来自网络,只是改了两个地方: len = sizeof(dbuf),if(i >=( __ERRLEN+1)) // 帧超长,错误,返回,就可以实现了,其中的原因自已体会吧*/#ifndef __485_C__#define __485_C__#include <reg51.h>#include <string.h>#include <stdio.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/* 通信命令*/#define __ACTIVE_ 0x01 // 主机询问从机是否存在#define __GETDATA_ 0x02 // 主机发送读设备请求#define __OK_ 0x03 // 从机应答#define __STATUS_ 0x04 // 从机发送设备状态信息#define __MAXSIZE 0x08 // 缓冲区长度#define __ERRLEN 12 // 任何通信帧长度超过12则表示出错//uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息uchar dbuf[__MAXSIZE];//={0,1,2,3,4,5,6,7}; // 该缓冲区用于保存设备状态信息uchar dev; // 该字节用于保存本机设备号sbit M_DE = P1^0; // 驱动器使能,1有效sbit M_RE = P1^1; // 接收器使能,0有效void get_status(); // 调用该函数获得设备状态信息,函数代码未给出void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用void main(){uchar type;uchar len;/* 系统初始化*/P1 = 0xff; // 读取本机设备号//dev = (P1>>2);dev = 0x01;TMOD = 0x20; // 定时器T1使用工作方式2TH1 = 250; // 设置初值TL1 = 250;TR1 = 1; // 开始计时PCON = 0x80; // SMOD = 1SCON = 0x50; // 工作方式1,波特率9600bps,允许接收ES = 0; // 关闭串口中断//IT0 = 0; // 外部中断0使用电平触发模式//EX0 = 1; // 开启外部中断0EA = 1; // 开启中断/* 主程序流程*/while(1) // 主循环{if(recv_cmd(&type) == 0) // 发生帧错误或帧地址与本机地址不符,丢弃当前帧后返回continue;switch(type){case __ACTIVE_: // 主机询问从机是否存在send_data(__OK_, 0, dbuf); // 发送应答信息,这里buf的内容并未用到break;case __GETDA TA_:// len = strlen(dbuf);//在C51中不能这个函数计算unsigned char型,这个函数只能计算char型len = sizeof(dbuf);// len =0x08;send_data(__STA TUS_, len, dbuf); // 发送设备状态信息break;default:break; // 命令类型错误,丢弃当前帧后返回}}}void READSTATUS() interrupt 0 using 1 // 产生外部中断0时表示设备状态发生改变,该函数使用寄存器组1{get_status(); // 获得设备状态信息,并将其存入dbuf指向的存储区,数据最后一字节置0表示数据结束}/* 该函数接收一帧数据并进行检测,无论该帧是否错误,函数均会返回* 函数参数type保存接收到的命令字* 当接收到数据帧错误或其地址位不为0时(非主机发送帧),函数返回0,反之返回1*/bit recv_cmd(uchar *type){bit db = 0; // 当接收到的上一个字节为0xdb时,该位置位bit c0 = 0; // 当接收到的上一个字节为0xc0时,该位置位uchar data_buf[__ERRLEN]; // 保存接收到的帧__ERRLEN=12;uchar tmp;uchar ecc = 0;uchar i;M_DE = 0; // 置发送禁止,接收允许M_RE = 0;/* 接收一帧数据*/i = 0;while(!c0) // 循环直至帧接收完毕{RI = 0;while(!RI);tmp = SBUF;RI = 0;if(db == 1) // 接收到的上一个字节为0xdb{switch(tmp){case 0xdd:data_buf[i] = 0xdb; // 0xdbdd表示0xdbecc = ecc^0xdb;db = 0;break;case 0xdc:data_buf[i] = 0xc0; // 0xdbdc表示0xc0ecc = ecc^0xc0;db = 0;break;default:return 0; // 帧错误,返回}i++;}switch(tmp) // 正常情况{case 0xc0: // 帧结束c0 = 1;break;case 0xdb: // 检测到转义字符db = 1;break;default: // 普通数据data_buf[i] = tmp; // 保存数据ecc = ecc^tmp; // 计算校验字节i++;}//if(i == __ERRLEN) // 帧超长,错误,返回if(i >=( __ERRLEN+1)) // 帧超长,错误,返回return 0;}/* 判断帧是否错误*/if(i<4) // 帧过短,错误,返回return 0;if(ecc != 0) // 校验错误,返回return 0;if(data_buf[0] != dev) // 非访问本机命令,错误,返回return 0;*type = data_buf[1]; // 获得命令字return 1; // 函数成功返回}/* 该函数发送一帧数据帧,参数type为命令字、len为数据长度、buf为要发送的数据内容*/void send_data(uchar type, uchar len, uchar *buf){uchar i;uchar ecc = 0; // 该字节用于保存校验字节M_DE = 1; // 置发送允许,接收禁止M_RE = 1;send_byte(dev); // 发送本机地址ecc = dev;send_byte(type); // 发送命令字ecc = ecc^type;send_byte(len); // 发送长度ecc = ecc^len;for(i=0; i<len; i++) // 发送数据{send_byte(*buf);ecc = ecc^(*buf);buf++;}send_byte(ecc); // 发送校验字节TI = 0; // 发送帧结束标志SBUF = 0xc0;while(!TI);TI = 0;}/* 该函数发送一个数据字节,若该字节为0xdb,则发送0xdbdd,若该字节为0xc0则,发送0xdbdc */void send_byte(uchar da){switch(da){case 0xdb: // 字节为0xdb,发送0xdbdd TI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdd;while(!TI)TI = 0;break;case 0xc0: // 字节为0xc0,发送0xdbdcTI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdc;while(!TI)TI = 0;break;default: // 普通数据则直接发送TI = 0;SBUF = da;while(!TI);TI = 0;}}#endif/* 调试结果*/。
51单片机与RS485应用电路图

1 问题的提出在应用系统中,RS-485半双工异步通信总线是被各个研发机构广泛使用的数据通信总线,它往往应用在集中控制枢纽与分散控制单元之间。
系统简图如图1所示。
图1. RS-485系统示意图由于实际应用系统中,往往分散控制单元数量较多,分布较远,现场存在各种干扰,所以通信的可靠性不高,再加上软硬件设计的不完善,使得实际工程应用中如何保障RS-485总线的通信的可靠性成为各研发机构的一块心病。
在使用RS-485总线时,如果简单地按常规方式设计电路,在实际工程中可能有以下两个问题出现。
一是通信数据收发的可靠性问题;二是在多机通信方式下,一个节点的故障(如死机),往往会使得整个系统的通信框架崩溃,而且给故障的排查带来困难。
针对上述问题,我们对485总线的软硬件采取了具体的改进措施2 硬件电路的设计现以8031单片机自带的异步通信口,外接75176芯片转换成485总线为例。
其中为了实现总线与单片机系统的隔离,在8031的异步通信口与75176之间采用光耦隔离。
电路原理图如图2所示。
图2 改进后的485通信口原理图充分考虑现场的复杂环境,在电路设计中注意了以下三个问题。
2.1 SN75176 485芯片DE控制端的设计由于应用系统中,主机与分机相隔较远,通信线路的总长度往往超过400米,而分机系统上电或复位又常常不在同一个时刻完成。
如果在此时某个75176的DE端电位为“1”,那么它的485总线输出将会处于发送状态,也就是占用了通信总线,这样其它的分机就无法与主机进行通信。
这种情况尤其表现在某个分机出现异常情况下(死机),会使整个系统通信崩溃。
因此在电路设计时,应保证系统上电复位时75176的DE端电位为“0”。
由于8031在复位期间,I/O口输出高电平,故图2电路的接法有效地解决复位期间分机“咬”总线的问题。
2.2 隔离光耦电路的参数选取在应用系统中,由于要对现场情况进行实时监控及响应,通信数据的波特率往往做得较高(通常都在4800波特以上)。
485通讯协议程序怎么写(51单片机的485通信程序案例)

485通讯协议程序怎么写(51单片机的485通信程序案例)
RS-485总线接口是一种常用的串口,具有网络连接方便、抗干扰性能好、传输距离远等优点。
RS-485收发器采用平衡发送和差分接收,因此具有抑制共模干扰的能力,加上收发器具有高的灵敏度,能检测到低达200mv的电压,可靠通信的传输距离可达数千米。
使用RS-485总线组网,只需一对双绞线就可实现多系统联网构成分布式系统、设备简单、价格低廉、通信距离长。
51单片机的485通信程序
#ifndef __485_C__ #define __485_C__
#include 《reg51.h》
#include 《string.h》
#define unsigned char uchar
#define unsigned int uint
/* 通信命令*/
#define __ACTIVE_ 0x01 // 主机询问从机是否存在
#define __GETDATA_ 0x02 // 主机发送读设备请求
#define __OK_ 0x03 // 从机应答
#define __STATUS_ 0x04 // 从机发送设备状态信息
#define __MAXSIZE 0x08 // 缓冲区长度
#define __ERRLEN 12 // 任何通信帧长度超过12则表示出错
uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息
uchar dev; // 该字节用于保存本机设备号
sbit M_DE = P1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我用的是天祥单片机实验板,由于没有RS485接口,我利用ADM485芯片自制了一个485接口,如图,但如果要进行半双工通讯,须将P3.0口到下载程序的RS232芯片的线断开可用一个跳线,用RS485的时候断开RS232,用RS232的时候插上跳线帽。硬件连接如图
PLC程序:
通讯我用单片机做主机(只发送指令),PLC做从机(只接收指令),单工单向,以便初学着掌握。
sbit led=P1^1;/*将RS485置为发送数据模式*/
unsigned char i;
void init()
{
SCON=0x50;/*串口中断开*/
TMOD=0x20;/*定时器设置*/
TH1=0xfd;/*定时时间的高位*/
TL1=0xfd;/*定时时间的低位,速度为9600BPS*/
TR1=1;/*定时器开*/
格式:1位启始,8位数据,一位停止。
所以PLC寄存器D8120:0C81.
plc程序很简单不懂的可以看下三菱PLC的通讯手册。如下图:
三:单片机程序:
#include<reg52.h>/*单片机的头文件*/
unsigned char code tab[]={0x17,0xff};/*PLC输出的Y点数,PLC输出Y灯0125678亮*/
QQ:79814563注明时工控交友
电话:15250151540
姓名:黄辉
2011年12月17日Saturday
51单片机与三菱PLC无协议通讯成功
我用了两个晚上的时间查阅一些资料,利用三菱PLC的扩展RS485通讯板与其51单片机连接通讯,可写PLC任意的地址。长度可达1000米,看见网上写的都很烦且对三菱和单片机不是很熟的朋友来说有一定的阅读难度,今天将它与大家分享。希望在此基础上大家能扩展出自己想要的功能,过些时间有空我在写个半双工的程序。
EA=1;/*开总中断*/
TI=0;/*复位串口中断*/
led=1;/*将RS485置为发送数据模式*/
}
void main()
{
init();/*调用子程序*/
for(i=0;i<2;i++)
{
SBUF=tab[i];/*将数据发送到串口*/
while(!TI);/*等待串口数据发送结束*/
TI=0;/*复位串口中断*/
}
}
四:注意点。
1:RS485的线不能接反,否则数据将不正确。
2:单片机的晶振要选择11.0592MHZ,否则PLC接收到数据也不正确。
3:RS485芯片的电源不能接反,否则要烧坏芯片。
今天要去山东调试机器,现在正在高铁上,刚好有空把这篇心得写好,有错误的地方还请大家指正,也希望有共同爱好的一起交流心得。