找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
{{itemCategory}}
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
楼主的想法很有意义,S7-200提供了自由口通讯方式,即开放了与第三方智能设备的通讯协议,方便了开发人员自由编程。
需注意以下几点:
1)S7-200虽在自由口通讯方式下,但其通讯端口的硬件配置是基于RS485基础上的,所以单片机侧的硬件设计需要注意这点。
2)通讯参数设置要一致。
3)单片机的串口工作方式有四种,要选择与S7-200通讯设置相匹配的工作方式。
以下程序段可供参考:
单片机程序
/*********************************************************************************************
函数名:UART串口初始化函数
调 用:UART_init();
参 数:无
返回值:无
结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备 注:振荡晶体为12MHz,PLC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init ( )
{
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
TMOD = 0x20; //定时器T/C1工作方式2
TH1 = 0xF3; //定时器初值高8位设置
TL1 = 0xF3; //定时器初值低8位设置
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TR1 = 1; //定时器启动
}
/**********************************************************************************************/
调 用:[SBUF收到数据后中断处理]
参 数:无
返回值:无
结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
备 注:过长的处理程序会影响后面数据的接收
/**********************************************************************************************/
void UART_R ( ) interrupt 4
{
//unsigned char UART_data; //定义串口接收数据变量
//接收
RI = 0; //接收中断标志位为0(软件清零)
bz = SBUF; //将接收到的数据送入变量 UART_data
if(3<=bz<=30)ZKB=bz;
if(bz>200)flag=bz;
//发送
SBUF = bz; //将接收的数据发送回去(删除//即生效)
while(TI == 0); //检查发送中断标志位
TI = 0; //发送中断标志位为0(软件清零)
}
PLC程序例
MAIN: S7200自由口通讯程序
LD SM0.1
CALL SBR_0:SBR0 //初始化子程序
LD SM0.7
= SM30.0
SBR_0: 初始化子程序
LD SM0.0
MOVW +2, VW8 //PLC自由口地址,此处每台机器需设不同的地址
LD SM0.0
MOVB 9, SMB30 //通讯参数,波特率9600,自由口通讯
MOVD &VB100, VD40
MOVW +10, VW54
MOVB 12, VB150
MOVB VB9, VB151
MOVD &VB151, VD60
MOVB 6, SMB34
ATCH INT_0:INT0, 10
ATCH INT_1:INT1, 8
ENI
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
找答案微信小程序
提问
搜索
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!