您现在所在的是:

串口通信

回帖:8个,阅读:5208 [上一页] [1] [下一页]
993
wizzly
文章数:30
年度积分:50
历史总积分:993
注册时间:2004/7/26
发站内信
发表于:2006/12/10 22:25:00
#0楼
西门子S7-300通讯协议不公开,我们无法按相应的协议写程序,但是西门子提供给我们更为简单的方式来与之通讯。
大家可以在某些组态软件中找到这样一个DLL:w95_s7.dll
就是这个DLL,使的我们与PLC进行数据交互极为简单
在DLL时定义了如下一些接口函数:
Public Declare Function load_tool Lib "w95_s7.dll" (ByVal nr As Byte, ByVal dev As String, adr As Type_PlcAddressType) As Long
这个函数是初始化连接用的,这个过程比较慢,大约要20S左右,这大概也是西门子为什么启动那么慢的原因吧;包括了如下几个参数:nr是指激活的连接数,范围是1-4
dev是设备名,SetPG/PC里面有这个指定,一般用S7ONLINE就可以了,adr是指参数表,它是这样的一个type:
Type Type_PlcAddressType
    bytAddress       As Byte'这是站号,默认是2
    bytPlcSegmentID  As Byte'SegmentID,默认是0
    bytPlcSlotNo     As Byte'槽号,默认是2
    bytPlcRackNo     As Byte'Rack号,默认是0
End Type

Public Declare Function new_ss Lib "w95_s7.dll" (ByVal nr As Byte) As Long
这个函数没用到,可以去找一些资料来看
Public Declare Function unload_tool Lib "w95_s7.dll" () As Long
'这个函数是程序退出时用的,用来断开连接
' no, amount, value
Public Declare Function d_field_read Lib "w95_s7.dll" (ByVal db As Long, ByVal nr As Long, ByVal anz As Long, value As Byte) As Long
'这是读取DB块中数据的函数
db 是指DB块号,比如DB10,则这个参数指定为10就可以了
nr 是指起始地址,比如读DB10的第4个字节中数据,则指定为4
anz是指读取的长度
value是返回的值,表面上看这是一个字节,但实际上它是一个字节数组,比如你要读取二十个字节的数据,那么应定义dim ReturnValue(20) as byte,然后用ReturnValue来做为传递的参数
Public Declare Function d_field_write Lib "w95_s7.dll" (ByVal db As Long, ByVal nr As Long, ByVal anz As Long, value As Byte) As Long
这是写DB块数据的函数,参数跟读数据函数一样,不多说了
' no, amount, value
Public Declare Function e_field_read Lib "w95_s7.dll" (ByVal nr As Long, ByVal anz As Long, value As Byte) As Long
‘这个是用来读取外部输入的值,包括开关量输入,模拟量输入
nr 是指起始地址
anz是指读取的长度
value是返回的值,表面上看这是一个字节,但实际上它是一个字节数组,比如你要读取二十个字节的数据,那么应定义dim ReturnValue(20) as byte,然后用ReturnValue来做为传递的参数
从分析也可以看出,只有外部输入的值不可以写,因而它单独存在
Public Declare Function a_field_read Lib "w95_s7.dll" (ByVal nr As Long, ByVal anz As Long, value As Byte) As Long
‘这是用来读取外部输出的值,包括开关量输出,模拟量输出,参数可以参照上面的函数,
Public Declare Function a_field_write Lib "w95_s7.dll" (ByVal nr As Long, ByVal anz As Long, value As Byte) As Long
‘这是用来写外部输出的值,包括开关量输出,模拟量输出
nr 是指起始地址,
anz是指读取的长度
value是返回的值
Public Declare Function m_field_read Lib "w95_s7.dll" (ByVal nr As Long, ByVal anz As Long, value As Byte) As Long
读取内存变量的函数(M的值)
nr 是指起始地址
anz是指读取的长度
value是返回的值
Public Declare Function m_field_write Lib "w95_s7.dll" (ByVal nr As Long, ByVal anz As Long, value As Byte) As Long
写内存变量的函数
nr 是指起始地址
anz是指读取的长度
value是返回的值
Public Declare Function t_field_read Lib "w95_s7.dll" (ByVal nr As Long, ByVal anz As Long, value As Integer) As Long
’读定时器的值
nr 是指起始地址
anz是指读取的长度
value是返回的值,这个返回的是整型量的值
Public Declare Function z_field_read Lib "w95_s7.dll" (ByVal nr As Long, ByVal anz As Long, value As Integer) As Long
‘读计数器的值
nr 是指起始地址
anz是指读取的长度
value是返回的值,这个返回的是整型量的值
Public Declare Function z_field_write Lib "w95_s7.dll" (ByVal nr As Long, ByVal anz As Long, value As Integer) As Long
‘写计数器的值
nr 是指起始地址
anz是指读取的长度
value是返回的值,这个返回的是整型量的值
有了以上这样函数,相信会VB的人都可以写跟西门子通讯的程序了。
但是如何知道读或写是否成功呢,这就是每个函数的返回值来决定,返回为0时,说明操作成功,否则为通讯出错。
好了,先写到这里了,希望对大家有点用处。
3422
dixinke
文章数:1062
年度积分:50
历史总积分:3422
注册时间:2004/9/9
发站内信
发表于:2007/7/31 18:18:00
#1楼
这么好的东西竟然没人顶,唉,狂顶!!!!
呵呵,去下个DLL先
1133
jeffzhang
文章数:103
年度积分:50
历史总积分:1133
注册时间:2006/11/30
发站内信
发表于:2007/8/20 10:51:00
#2楼
这个函数是初始化连接用的,这个过程比较慢,大约要20S左右

这个…………
积极发言,有错误请指正
1036
coney
文章数:61
年度积分:50
历史总积分:1036
注册时间:2005/12/30
发站内信
发表于:2007/9/12 23:05:00
#3楼
那S7-200的又怎样做啊?
927
gaohuipeng
文章数:4
年度积分:50
历史总积分:927
注册时间:2008/1/26
发站内信
发表于:2008/1/26 20:11:00
#4楼
hao  !!!!!
919
weililun
文章数:7
年度积分:50
历史总积分:919
注册时间:2005/2/16
发站内信
发表于:2008/1/31 20:07:00
#5楼
顶起
1141
fwall
文章数:12
年度积分:50
历史总积分:1141
注册时间:2005/9/23
发站内信
发表于:2008/2/19 13:05:00
#6楼
S7-200 PPI编成我这里有
QQ:314483554
1048
xaygc
文章数:61
年度积分:50
历史总积分:1048
注册时间:2007/12/10
发站内信
发表于:2008/2/26 12:00:00
#7楼
好文章,不知楼主用过吗?
943
sl_zh76
文章数:24
年度积分:50
历史总积分:943
注册时间:2006/11/5
发站内信
发表于:2008/4/15 9:57:00
#8楼
hao

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

124.8008