
西门子PLC针对外部设备,使用串口通信时,协议为MODBUS,但通常为2种方式,1是PLC为主站,读取外部设备信号,比如变频器,温控器等,从网上下载西门子200PLC指令库;
调用里面的集成指令MASTER即可,不会写的找到那些指令按F1,帮助里都有范例。然后对照设备厂家的数据接口表,从接收到的数据里剥离自己想要的数据,逻辑处理后再写进去。
第2种是PLC是从站,响应外部主站信号,比如楼宇自控系统要读取你PLC的数据,就走MODBUS协议,在指令库里找到SLAVER指令,调用。至于什么接口并不是重点,接口可以转化。
扩展资料:
当PLC的RS485口经非隔离的PC/PPI电缆与电脑连接、PLC与PLC之间连接或PLC与变频器、触摸屏等通信时时有通信口损坏现象发生,较常见的损坏情况如下:
R1或R2被烧断,Z1、Z1和SN75176完好。这是由于有较大的瞬态干扰电流经R1或R2、桥式整流、Z1或Z1到地,Z1、Z2能承受最大10A电流的冲击,而该电流在R1或R2上产生的瞬态功率为:102×10=1000W,当然会将其烧断。
SN75176损坏,R1、R2和Z1、Z2完好。这主要可能是受到静电冲击或瞬态过电压速度快于Z1、Z2的动作速度造成的,静电无处不在,仅人体模式也会产生±15kV的静电。
Z1或Z2、SN75176损坏,R1和R2完好。这可能是受到高电压低电流的瞬态干扰电压将Z1或Z2和SN75176击穿,由于电流较小和发生时间较短因而R1、R2不至于发热烧断。
由以上分析得知PLC接口损坏的主要原因是由于瞬态过电压和静电造成,产生瞬态过电压和静电的原因很多也较复杂,如由于PLC内部24V电源和5V电源共地,24V电源的输出端子L+、M为其它设备混合供电可能导致地电位变化,从而造成共模电压超出允许范围。
所以EIA-485标准要求将各个RS485接口的信号地用一条低阻值导线连接在一起以保证各节点的地电位相等,消除地线环流!
当带电插拔未隔离的连接电缆时,由于两端电位不相等电路中又存在诸多电感、电容之类的器件,插拔瞬间必然产生瞬态过电压或过电流。
连接在RS485总线上的其它设备产生的瞬态过电压或过电流同样会流入到PLC,总线上连接的设备站点数越多,产生瞬态过电压的因素也越多。
首先硬件要有max232芯片做电平转换或者直接用pl2303做usb转串口
软件要有一个串口调试工具
至于程序就是
(1):设置串口相关寄存器
注意波特率设置
(2):把数据放在sbuf里面
(3):检查是否发送完毕没完等待
发完了就继续放
各种单片机设置方法不一样就给你一个51
的程序你参考一下:
//wx原创
串口调试程序
向pc发送数据
用于调试观察数据
#include
#include
sbit
k1=p10;
void
ckfszf(char
zf);
void
ckfszfc(char
fsgs,char
zfc[]);
bit
cksnbzw=0;
char
fsb[]={"abcdef"};
main()
{
pcon=0x80;
//串口设置
tmod=0x20;
//
以t1定时器为波特发生器
波特率:19200
th1=0xfd;
tl1=0xfd;
tr1=1;
scon=0x50;
//串口设置模式一完毕
while(1)
{
ti=1;
ckfszfc(6,fsb);
ckfszf('
');
ckfszfc(9,"1234567890");
ckfszf('
');
ckfszf('
');
ckfszf('
');
ckfszfc(12,"aabbccddeeffgg");
ckfszf('
');
while(1);
}
}
//字符
串口发送函数
由串口向外发送一个字符
//参数1:要发送字符
//返回值:无
//备注:
本函数内部检查上次发送是否结束
//
全局初始化要求:ti=1
保证第一次进入此函数之前ti=1
void
ckfszf(char
zf)
{
while(ti==0);
//等待发送完毕
ti=0;
sbuf=zf;
}
//字符串
串口发送函数
由串口向外发送一个字符串
//参数1:要发送字符串个数
取值:0~255
//参数2:要发送字符串数组名
或字符串本身
//返回值:无
//备注:
本函数内部检查上次发送是否结束
//
全局初始化要求:ti=1
保证第一次进入此函数之前ti=1
void
ckfszfc(uchar
fsgs,char
zfc[])
{
uchar
i;
cksnbzw=1;
for(i=0;i
评论
0
0
加载更多1、通信至少需要两台设备。
2、单片机的串口可以连接到另外一台具有UART功能的设备,如另一台单片机或电脑。
3、读进的数据并不是单片机本身的内容,而是另一台设备发出的。
4、符合异步串行通信帧格式和约定波特率的字符。一、文件下载
文件下载地址:
也可以下载我上传到网盘上的:
二、文件内容介绍
1下载到的文件为qextserialport-12win-alpha ,解压并打开后其内容如下。
(点击可以查看清晰大图)
下面分别介绍:
(1)doc文件夹中的文件内容是QextSerialPort类和QextBaseType的简单的说明,我们可以使用记事本程序将它们打开。
(2)examples文件夹中是几个例子程序,可以看一下它的源码,不过想运行它们好像会出很多问题啊。
(3)html文件夹中是QextSerialPort类的使用文档。
(4)然后就是剩下的几个文件了。其中qextserialenumeratorcpp及qextserialenumeratorh文件中定
义的QextSerialEnumerator类是用来获取平台上可用的串口信息的。不过,这个类好像并不怎么好用,而且它不是我们关注的重点,所以下面
就不再介绍它了。
(5)qextserialbasecpp和qextserialbaseh文件定义了一个QextSerialBase
类,win_qextserialportcpp和win_qextserialporth文件定义了一个Win_QextSerialPort
类,posix_qextserialportcpp和posix_qextserialporth文件定义了一个
Posix_QextSerialPort类,qextserialportcpp和qextserialporth文件定义了一个
QextSerialPort类。这个QextSerialPort类就是我们上面所说的那个,它是所有这些类的子类,是最高的抽象,它屏蔽了平台特征,
使得在任何平台上都可以使用它。
2几个类的简单介绍。
下面是这几个类的关系图。
可以看到它们都继承自QIODevice类,所以该类的一些函数我们也可以直接来使用。图中还有一个QextBaseType类,其实它只是一个标
识,没有具体的内容,它用来表示Win_QextSerialPort或Posix_QextSerialPort
中的一个类,因为在QextSerialPort类中使用了条件编译,所以QextSerialPort类既可以继承自
Win_QextSerialPort类,也可以继承自Posix_QextSerialPort类,所以使用了QextBaseType来表示。这一点
我们可以在qextserialporth文件中看到。再说QextSerialPort类,其实它只是为了方便程序的跨平台编译,使用它可以在不同的
平台上,根据不同的条件编译继承不同的类。所以它只是一个抽象,提供了几个构造函数而已,并没有具体的内容。在qextserialporth文件中的
条件编译内容如下:
#ifdef_TTY_POSIX_
#include“posix_qextserialporth”
#define QextBaseTypePosix_QextSerialPort
#else
#include“win_qextserialporth”
#define QextBaseTypeWin_QextSerialPort
#endif
所以,其实我们没有必要使用这个类,直接使用Win_QextSerialPort或Posix_QextSerialPort就可以了。当然如果
你想使用这个类,实现同样的源程序可以直接在Windows和Linux下编译运行,那么一定要注意在Linux下这里需要添加
#define _TTY_POSIX_ 。而我们这里为了使得程序更明了,所以没有使用该类,下面也就不再介绍它了。
QextSerialBase类继承自QIODevice类,它提供了 *** 作串口所必需的一些变量和函数等,而
Win_QextSerialPort和Posix_QextSerialPort均继承自QextSerialBase
类,Win_QextSerialPort类添加了Windows平台下 *** 作串口的一些功能,Posix_QextSerialPort类添加了
Linux平台下 *** 作串口的一些功能。所以说,在Windows下我们使用Win_QextSerialPort类,在Linux下我们使用
Posix_QextSerialPort类。
3在QextSerialBase类中还涉及到了一个枚举变量QueryMode。
它有两个值Polling和EventDriven
。QueryMode指的是读取串口的方式,下面我们称为查询模式,我们将Polling称为查询方式Polling,将EventDriven称为事件驱动方式。
事件驱动方式EventDriven就是使用事件处理串口的读取,一旦有数据到来,就会发出readyRead()信号,我们可以关联该信号来读取串口的数据。在事件驱动的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。
而查询方式Polling则不同,读写函数是同步执行的,信号不能工作在这种模式下,而且有些功能也无法实现。但是这种模式下的开销较小。我们需要自己建立定时器来读取串口的数据。
在Windows下支持以上两种模式,而在Linux下只支持Polling模式。
三、小结。
这里讲了这么多,最后要说的只是,我们在Qt中使用这个类编写串口程序,根据平台的不同只需要分别使用四个文件。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)