open Socket(By Val port As Long, ByVal peer As String)函数中,由于西门子以太网
中的ISO on TCP协议所使用的数据传输端口为102[
51],所以port被设置为102,而peer
则为PLC的以太网地址。
How to use libnodave?
libnodave可以直接通过网口访问西门子PLC200,300及以上型号,无需安装西门子prodave驱动
libnodave-0.8.5: 网上开源的西门子PLC读写库;
TIA V14 sp1, 西门子PLC程序编写软件, 本测试基本不用编写PLC程序;
SIEMENS.PRODAVE MPI/IE V6.0 Manual.2005
端口:是英文port的义译,可以认为是计算机与外界通讯交流的出口。其中硬件领域的端口又称接口,如:USB端口、串行端口等。
接口:通信的两个机器的相同层次的实体叫做同层进程,它们之间的通信使用的各种约定统称协议,相邻层之间的约定称为接口。
基于 LIBNODAVE 的上位机与西门子 PLC 的通信-2010
LIBNODAVE 提 供类似于 PRODAVE 的动态链接库供用户编程调用, 但其所包 含的应用函数、支持的硬件和连接方式都比 PRODAVE 多。
。它可 以访问通过 PLC 程序能访问的存储区域:位存储区、数据块、输 入/输出映像区、定时器和计数器等。另外,LIBNODAVE 还可以 读取 PLC 程序中的功能块。
,LIBNODAVE 还有一个不 足是开发文档不够完整.,LIBNODAVE 已经可以结合 C、C++、C#、VB.NET、VB、 Pascal、Delphi、Perl 来使用,LIBNODAVE 的软件包里提供了相应 的测试例子,但是功能并不完善
而且可以进一步通过 Tk、Qt 等跨 平台 GUI 软件将 LIBNODAVE 的上位机功能拓展到嵌入式系 统中去.
的 TCP/IP 网络通信方式介 绍 LIBNODAVE 的应用。当使用这种方式时,只需设置上位机主 机的 IP 与 PLC 的 IP 在同一网段 (仅 IP 地址的最后一段不同), 无需 PG/PC 接口的设置,从而免除了对西门子软件的依赖。
内置以太网 口或加配 CP343)
- 端口连接函数openSocket
- 端口通信设置函数daveNewInterface
- 适配器初始化(接口)daveInitAdapte
- ) 与某个 PLC 建立连接的函数n daveNewConnection
- 存储区读写函数daveReadBytes,daveWriteBytes
设要读取的数据区为:MB5、MW6、MD8、MD14, 数据类型分 别为 BYTE、INT、REAL、DINT
peer$ = "192.168.0.10" ' 此处设为 PLC 的 IP 地址
ph = openSocket(102, peer$)
If (ph > 0) Then
di = daveNewInterface (ph, ph, "IF1", 0, daveProtoISOTCP,
daveSpeed187k)
res = daveInitAdapter(di)
If res = 0 Then
Mpi=2 ' 单个 PLC 的位置一般为 Mpi=2,Rack = 0,Slot = 2
Rack = 0
Slot = 2
dc = daveNewConnection(di, Mpi, Rack, Slot)
res = daveConnectPLC(dc)
If res = 0 Then
initialize = 0 ' 连接成功
End If
End If
End If
res = daveDisconnectPLC(dc) ' 断开与 PLC 的连接
Call daveFree(dc) ' 释放内存
dc = 0
res = daveDisconnectAdapter(di) ' 断开与适配器的连接
Call daveFree(di)
di = 0
res = closePort(ph) ' 关闭通讯端口
ph = 0
'这里是读
res = daveReadBytes(dc, daveFlags, 0, 5, 13, 0)
If res = 0 Then
v1 = daveGetS8(dc)
v2 = daveGetS16(dc)
v3 = daveGetFloat(dc)
v4 = daveGetS32At(dc,9)
End If
Dim buffer(20) As Byte
res = daveReadBytes(dc, daveFlags, 0, 5, 13, buffer(0))
If res = 0 Then
v1 = daveGetS8from(buffer(0))
v2 = daveGetS16 from (buffer(1))
v3 = daveGetFloat from (buffer(3))
v4 = daveGet S32 from (buffer(9))
End If
'现在是写字节?
Dim buffer(20) As Byte
a = davePut8(buffer(0), d1)
a = davePut16(buffer(1), d2)
a = davePut32(buffer(3), d3)
a = davePutFloat(buffer(7), d4)
res = daveWriteBytes(dc, daveDB, 1, 5, 11, buffer(0))
(3) 读 1 位
设要读取的位为 DB5.DBX3.2,则函数调用方式为:
res = daveReadBits(dc, daveDB, 5, (3*8+2), 1,0)' 其中“8”是
指每个字节有 8 位
If res = 0 Then