您的位置:控制工程论坛网论坛 » PLC与PAC » S7-200短信通讯指导

ljs625

ljs625   |   当前状态:离线

总积分:1029  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2022-08-03

空间 发短消息加为好友

S7-200短信通讯指导

ljs625  发表于 2008/8/9 16:05:50      1445 查看 2 回复  [上一主题]  [下一主题]

手机阅读

S7-200 自由口通讯
自由口模式允许应用程序控制S7-200 CPU 的通讯端口,使用PC/PPI 电缆和自由口功能,
可以将S7-200 连接到带有RS-232 兼容接口的多种设备,比如调制解调器。这里我们将介绍如
何用S7-200 连接GSM 调制解调器发送短消息,并通过这个例子来介绍应用S7-200 自由口编程
的一般原则时及应注意的问题。
在下面的例子中我们将用到:
1. PC/PPI 电缆(10 位;9 600 波特;DIP 开关设置:0 1 0 1 1)
2. 西门子 S7-200 CPU22X
3. TC35 Terminal GSM 调制解调器
4. 一个9 直通针转接头(用来连结PC/PPI 电缆与TC35 Terminal 调制解调器)
5. 一根九针直通电缆(用来连结计算机与TC35 Terminal 调制解调器)
6. STEP 7-Micro/Win V3.2 或更高版本软件
一、 TC35 调制解调器AT 指令简介
要使用TC35 发送短消息需要使用TC35 的AT 指令,我们首先介绍如何用Windows 自带的
超级终端连接TC35 发送短消息。
1. 用九针直通的电缆将TC35 连接到计算机的串口上
2. 打开超级终端(开始程序附件通讯超级终端)
3. 为连接取名Connect to TC35T
4. 选择TC35 连接的串口COM1
5. 按照下图的参数设置端口。19 200 bps 为TC35 默认的端口波特率,如果该波特率已被
更改,请选择正确的波特率。
6. 在窗口中键入AT 回车测试与TC35 的连接,如果连接正确,TC35 将返回OK。
7. TC35 可以发送两种格式的短消息,普通文本格式和PDU 格式。应用普通文本格式时,
短消息内容以ASCII 码格式直接输入,操作比较简单,缺点是只能发送英文短消息;应
用PDU 格式时,短消息内容以Unicode 格式输入,可以发送任何文字,缺点是短消息
内容需要转换成Unicode 码,并且要把短消息按PDU 格式打包,操作比较复杂(编程
复杂)。通过指令AT+CMGF=0 设置TC35 以PDU 格式发送短消息(默认),AT+CMGF=1
设置TC35 以普通文本格式发送短消息。
8. 如何以普通文本格式发送短消息可以在S7-200 的网站上找到
http://www.ad.siemens.com.cn/applic/s7-200/modem.asp ,这里我们将介绍如何发送中文
短消息。要发送中文短消息必须把短消息内容转换成Unicode 码,并按照PDU 格式打
包发送给TC35。PDU 数据格式涉及手机开发的相关知识,我们不作详细介绍,这里指
给出一个标准格式供大家使用。以下就是一个PDU 格式的数据包:
0001000D91683108214365F700080459296C14
其中,红色的数字(3108214365F7)代表对方的手机号码,在PDU 格式中,手机号
码每两位需要对调。比如在上面这个例子里,对方的手机号码为13801234567,F 用来补充
7 后面的空位。蓝色的数字(59296C14)是短消息内容的Unicode 码,这里5929 代表“天”
6C14 代表“气”。Unicode 码同样可以用来表示中一般英文字母和数字,方法是在英文或数
字的ASCII 码前加00。紫色的数字(04)代表短消息的长度,它等于其后所有字符个数除
以2。黑色的数字每次发送短消息时都是相同的,使用时可以照抄,但前提是所使用的SIM
卡在使用前要用手机设置好短消息服务中心号码(+8613800100500)。汉字的Unicode 码可
以通过编码转换软件得到,我们使用的是Megaton Technology 公司的一个编码转换软件
9. 在使用PDU 格式发送短消息时,还必须计算整个PDU 数据包的长度,PDU 数据包的
长度等于(PDU 数据包字符数-2)/2,在上面的例子里:(38-2)/2=18。发送短消息时,
我们先向TC35 发送AT+CMGS=<Length>回车(Length 是计算好的PDU数据包的长度),
TC35 收到指令后返回一个“〉”符号,然后我们发送整个PDU 数据包并以组合键Ctrl+Z
结束。
如果短消息被成功的发送,TC35 会返回+CMGS: x,其中“x”代表该模块以及发送
的短消息个数,同时返回OK。
二、 设置TC35
在将TC35 连接到S7-200 之前我们先要对TC35 作一些设置,使其适合与PLC 通讯。
1. 通过指令AT+IPR=9600 设置TC35 的端口波特率为9 600 bps
2. 重新建立一个波特率为9 600 bps 的连接,用指令ATE0 禁止回波功能。回波功能使调
制解调器将收到的指令回发给发送方,这项功能会给PLC 编程来来不便,当禁止回波功
能后,TC35 只返回指令执行的结果,比如OK 等等
3. 键入AT&W0 回车将当前设置存为用户配置文件(掉电保持),再键入ATZ0 以用户配
置文件重新启动。此后TC35 重新上电时将按照前面所作的设置启动。
三、 PLC 编程
现在,我们已经知道如何用AT 指令发送短消息,剩下的工作是用PLC 程序来发送这些AT
指令。S7-200 的通讯端口为RS-485 接口,RS-485 接口为半双工接口,因此,编写PLC 程序的
关键是避免在通讯端口上同时发送和接收。我们下面将介绍一种标准的编程模式,按照这种模
式编写自由口通讯程序可以有效的避免因同时发送和接收造成的通讯冲突,从而保证程序的正
常运行。
1. 初始化
Network 1
LD SM0.1
MOVB 9, SMB30
MOVB 2#11000100, SMB87
MOVB '>', SMB88
MOVW +5, SMW92
MOVB 255, SMB94
ATCH INT_0, 23
ATCH INT_1, 9
ENI
将上面这段程序添加到主程序中,对PLC 的端口0 进行初始化。这段程序以SM0.1 为触发
条件,每当PLC 进入RUN 状态时执行一次。
MOVB 9, SMB30 该指令将端口0 设置为 9600,8,N,1 自由口方式
MOVB 2#11000100, SMB87 SM87.7=1 允许端口0 接收字符
SM87.6=1 当检测到与SMB88 中相同的字符时开始接收,
并将该字符当作信息的首字符
SM87.5=0 不检测信息的结束字符
SM87.4=0 不检测端口空闲状态
SM87.3=0 定时器为内部字符定时器,意思是PLC 开始接
收信息后(检测到起始字符),每接收到一个字
符就启动定时器,当定时器到达在SMW92 中设
置的时间后,即认为定时器超时
SM87.2=1 允许在定时器超时后停止接收,并产生接收完成
中断
SM87.1=0 忽略Break 条件
MOVB '>', SMB88 设置接收起始字符为ASCII 码的”>” , 当TC35 收到
AT+CMGS=<Length>后将返回”>”,当PLC 收到”>”后发送
PDU 数据包
MOVW +5, SMW92 设置定时器超时时间为5 ms
MOVB 255, SMB94 设置RCV 指令接收的最大字符数位255
ATCH INT_0, 23 中断时间23 为端口0 接收完成中断,将该中断连接到中断0
ATCH INT_1, 9 中断时间9 为端口0 发送完成中断,将该中断连接到中断1
ENI 中断允许
2. 接收TC35 的信息
Network 2
LD SM0.0
RCV VB100, 0
在初始化程序中,端口0 以被允许接收来自TC35 的信息,在主程序中添加上面的程序将端
口0 置于接收状态。这时端口0 将检测收到的字符,当收到”>”时即开始接收,并把收到的信息
保存到VB101 开始的存储器中(VB100 中将保存每次收到的字符的个数,当接收结束时,该位
置被清零)。
3. 发AT 指令
PLC 要向TC35 发送两部分内容来发送一条短消息,首先是AT 指令(AT+CMGS=18),
当收到”>”后,发送PDU 数据包。这里,我们用M0.0 的上升沿来触发PLC 发送AT 指令。在
主程序中添加下面指令
Network 3
LD M0.0
EU
R SM87.7, 1
RCV VB100, 0
XMT VB0, 0
R SM87.7, 1 SM87.7 置0,禁止在端口0 接收信息
RCV VB100, 0 执行RCV 指令,停止端口0 的接收。
XMT VB0, 0 发送AT 指令到TC35
这里需要特别注意的是,在初始化程序中,端口0 已被置为接收状态,此时如果直接发送
AT 指令,将会导致端口0 发生通讯冲突,而导致其不能正常工作。因此,我们在发送指令前必
须先禁止接收(将SM87.7 复0)然后执行RCV 指令,RCV 指令执行时将会检测SM87.7 的状
态,当发现SM87.7=0 时,即停止端口0 的接收。这里我们建议,在使用XMT 指令前,首先执
行R SM87.7, 1 、 RCV VB100, 0 两条指令(VB100 可以换成其他地址)。
XMT 指令指向VB0,我们将AT 指令写在VB0 开始的数据块中
4. 发送PDU 数据包
当AT 指令发送完成时,PLC 会产生一个中断,在初始化程序中,我们已经将这个中断连接
到INT_1(ATCH INT_1, 9),在这个中断中,我们重新把端口0 置于接收状态,用来接收
TC35 返回的“>“,同时我们将M0.0 复位以便检测下一次发送请求并清空RCV 指令的接收缓冲
区。将下面指令添加到INT_1 中:
Network 1
LD M0.0
S SM87.7, 1
RCV VB100, 0
R M0.0, 1
Network 2
LD SM0.0
FILL +0, VW100, 10
TC35 接收到AT+CMGS=18 后,返回”>”,PLC 接收到”>”后开始将接收到的字符保存到
VB101 开始的存储区,并且每接收一个字符即启动定时器,超过5 ms 仍接收不到下一个字符时,
就认为本次接收已经完成,产生接收完成中断。在初始化程序中我们已经将该中断连接到INT_0
(ATCH INT_0, 23)。将下面指令添加到INT_0 中:
Network 1
LDB= VB101, '>'
S M0.1, 1
在中断程序中不易执行过多程序,因此我们在这里判断VB101 是否为”>”,如果是则表示
TC35 等待接收PDU 数据,我们通过M0.1 在主程序中触发发送PDU 数据。将下面这段程序添
加到主程序中:
Network 4
LD M0.1
EU
R SM87.7, 1
RCV VB100, 0
XMT VB20, 0
与发送AT 指令一样,我们首先要停止端口0 的接收,然后发送PDU 数据包,PDU 数据包
保存在VB21 开始的数据块中,VB20 中保存XMT 指令要发送的字节数目。
5. 判断发送状态
在发送完成中断中,我们要重新置端口0 为接收状态,同时复位M0.1,并将RCV 指令判
断的起始字符由原来的”>”改为”+”,因为TC35 接收到PDU 数举包后会返回”+CMGS: x”表示
发送成功,或者” +CMS ERROR: 500”表示发送失败,将下面的指令添加到INT_1 中
Network 3
LD M0.1
S SM87.7, 1
MOVB '+', SMB88
RCV VB100, 0
R M0.1, 1
在接收完成中断中(INT_0)我们可以通过判断VB104 的状态来判断发送是否成功,如果
发送成功,VB104=”G”,如果不成功VB104=”S”。将下面的指令添加到INT_0 中
Network 2
LDB= VB104, 'G'
MOVB '>', SMB88
Network 3
LDB= VB104, 'S'
MOVB '>', SMB88
S M0.0, 1
如果成功则将RCV 指令的起始字符恢复为”>”,如果不成功则将RCV 指令的起始字符恢复
为”>”同时置位M0.0 重新发送短消息。
将整个程序下载到PLC 中,每次置位M0.0 即可以向13801234567 发送一条短消息,短消
息内容为“天气”。只要更改数据块中的内容,即可向不同的手机号码发送不同内容的短消息。
整个程序如下:
MAIN
Network 1
LD SM0.1
MOVB 9, SMB30
MOVB 2#11000100, SMB87
MOVB '>', SMB88
MOVW +5, SMW92
MOVB 255, SMB94
ATCH INT_0, 23
ATCH INT_1, 9
ENI
Network 2
LD SM0.0
RCV VB100, 0
Network 3
LD M0.0
EU
R SM87.7, 1
RCV VB100, 0
XMT VB0, 0
Network 4
LD M0.1
EU
R SM87.7, 1
RCV VB100, 0
XMT VB20, 0
INT_0
Network 1
LDB= VB101, '>'
S M0.1, 1
Network 2
LDB= VB104, 'G'
MOVB '>', SMB88
Network 3
LDB= VB104, 'S'
MOVB '>', SMB88
S M0.0, 1
INT_1
Network 1
LD M0.0
S SM87.7, 1
RCV VB100, 0
R M0.0, 1
Network 2
LD SM0.0
FILL +0, VW100, 10
Network 3
LD M0.1
S SM87.7, 1
MOVB '+', SMB88
RCV VB100, 0
R M0.1, 1
四、 总结
这里我们总结以下自由口编程的一般原则:
1. SM0.1 触发端口初始化,连接发送完成和接收完成中断(中断事件9 和23)
2. SM0.0 触发RCV 指令
3. XMT 指令用上升沿触发,并在指令运行前先停止端口0 的接收(复位SM87.7,
执行RCV 指令)
4. 在发送完成中断中,重新置端口0 为接收状态(置位SM87.7,执行RCV 指令),
清空RCV 指令的接收缓冲区
5. 尽量减少在中断程序中编程,如果时间允许仅在中断程序中置标志位,然后在主
程序中扫描该位执行具体的程序
6. 根据将要接收信息的不同,合理设置SMB87~SMB94
1楼 0 0 回复
  • 匿名

    匿名   |   当前状态:离线

    总积分:0  2024年可用积分:0

    注册时间: 0001-01-01

    最后登录时间: 0001-01-01

    空间 发短消息加为好友

    匿名   发表于 2008/8/9 16:05:50

    如果发指定的数据 如何编写程序啊 ?例如 PLC只发送例如16进制数 57到该怎么写啊 ?


     

    2楼 回复本楼

    引用 匿名 2008/8/9 16:05:50 发表于2楼的内容

总共 , 当前 /