西门子模块6ES7216-2AD23-0XB8诚信交易
三菱A900系列触摸屏与西门子S7-300系列PLC连接
目前,三菱电机的人机界面产品主要包括GOT-A900系列和GOT-F900系列两种。
对于GOT-A900系列,在使用之前需要安装OS(包括基本OS、通讯驱动等)。其中的通讯驱动需要根据所连接的对象以及所采用的连接方式选择安装。
以A970GOT为例,应在A970GOT上安装A9GT-RS2串行通讯板,并安装对应的通讯驱动(SIEMENS S7-300/400),且需通过西门子制造的HMI Adapter(6ES7 972-0CA11-0XA0)与西门子S7-300系列PLC进行连接。
1.西门子S7-300系列PLC的设置:
在STEP7软件中按照以下步骤进行设置。
① 双击“SIMATIC 300”项。
PLC资料网
② 双击“Hardware”项。
③ 双击“CPU 315-2 DP”一栏。
④ 点击“Properties…”按钮,在弹出的对话框中进行如下设置:
⑤ 在“SIMATIC Manager”窗口的“Options”菜单中选择“Set PG/PC Interface”。
⑥ 双击“PC Adapter(MPI)”一栏,并进行如下设置:
⑦ 选择“Local Connection”选项卡,并进行如下设置:
2.GOT的设置:
在GOT实用菜单的“SETUP”中设置如下:
3.西门子HMI Adapter与GOT(A9GT-RS2)接线图如下:
西门子制造的电缆(6ES7 901-1BF00-0XA0)也可使用。
对于GOT-F900系列(F940GOT,F930GOT),需通过其内置的RS232C口经由西门子制造的HMI Adapter(6ES7 972-0CA11-0XA0)与西门子S7-300系列PLC进行连接。
1. 西门子S7-300系列PLC的设置(同上)
2. GOT的设置:
在GOT的系统画面中设置如下:
DST站号(目标站号)根据在S7-300中的设置应设为2。
3. 西门子HMI Adapter与GOT(RS232C口)接线图如下:(同上)
、概述
Hilscher NETbbbb用于将西门子MPI协议转换为以太网TCP/IP协议,并提供公开的无需授权的驱动函数库。
NETbbbb有三种应用:
1、对于仅仅需要STEP7编程监控和WINCC监控,安装IBHNET127驱动即可,该驱动安装后将在控制面板的Set PG/PCInterface中添加IBHNet MPI/PPI/Profibus三个驱动连接;将STEP7(S7ONLINE)和WINCC(MPI)的访问点指向以上驱动连接即可。
2、对于第三方组态软件(如KingView、iFix等)通过NETbbbb访问PLC,选择我公司开发的OPCServer。
3、对于VB或者VC++(6.0以上版本)的自行开发界面,有两种方法实现通讯:
l 调用Hilscher提供的IPDriver驱动函数库进行通讯;
l 使用winsock控件进行通讯;
本文对在VB6.0中通过Hilscher IPDriver驱动库读写S7300/400 PLC数据的基本开发步骤作简要描述,具体资料可以参考NETbbbb光盘netDEVICESystem Software中的Nlmpi_pie.pdf和Drv_Ip.pdf文件,该光盘可到 http://www.gkong.com/co/beichen-automation/index_downloadbbbb页面中下载。
二、平台和配置
1、平台:bbbbbb2000+SP4,Microsoft VB6.0;
2、软件和驱动安装:Hilscher SYCON软件和IP Driver;
3、硬件要求:NETbbbb电缆一根,西门子S7300CPU一台(如CPU314),以太网交换机一台(如TP-bbbb),以太网电缆;
4、系统配置:如下图所示
三、NETbbbb参数配置
如上图所示,将计算机网卡的IP地址配置为192.168.1.10,将NETbbbb的RJ45端口链接到交换机端口上,另一端插入CPU314的MPI通讯口,NETbbbb是由CPU314的MPI口供电的。如果CPU上已经连接了其他监控设备如触摸屏,则可以选用西门子带编程口的网络插头。
在NETbbbb链接到MPI端口后的三分钟内(上电三分钟内)运行[开始]-[程序]-[Hilscher IPDriver]-[NetIdent Demo Program],点击[StartPoll]按钮自动查找网络上的NETbbbb,找到后将会显示NETbbbb信息,NETbbbb出厂默认IP地址为0.0.0.0,选择显示的NETbbbb并点击[SetIP]按钮,设置IP地址为192.168.1.88;如果软件找不到NETbbbb,请用PING命令检查网络是否链接正确。
注意1:通过NetIdent设定的IP地址是临时的,在NETbbbb上电后将自动恢复到原来的IP地址;
注意2:NETbbbb上电的三分钟内允许通过NetIdent设定其IP地址,三分钟后设定将被拒绝;
设定好NETbbbb的IP地址后运行[开始]-[程序]-[SyCon SystemConfigurator],新建项目并添加NETbbbb设备,双击NETbbbb并设定网络参数,IP地址设为192.168.1.88,选择自动检测接口和自动速率识别,NETbbbb的MPI地址设定为1(注意不要和MPI网络上其他站点地址冲突);设定好参数后将其下载到NETbbbb。(具体可以参考《Netbbbb和IBHNet驱动在SIEMENSSTEP7 WINCC中的使用说明.doc》中的描述)
注意3:通过SYCON软件设定的IP地址是固定的,在NETbbbb上电后不会改变;
四、IP Driver参数配置
运行[开始]-[程序]-[Hilscher IP Driver]-[IP Driver Setup],在Connection0中输入NETbbbb的IP地址:192.168.1.88、1099、TCP、Client、5000;
运行[开始]-[程序]-[Hilscher IP Driver]-[IP Driver Test],在菜单[Connectionselect]中选择Connection 0,连接后进行其他菜单的测试,如[Driver Info]等,如果测试正常说明IPDriver已连接到NETbbbb。
五、VB应用
应用举例:
1、 按下[循环启动]按钮后周期性读取MW0的数值(间隔100ms),直到按下[停止]按钮。
2、 按下[写入新值]按钮命令将新值写入MW0。
3、 [复位NETbbbb]按钮初始化NETbbbb。
演示界面如下图所示:
开发步骤:
1、 新建VBEXE工程,将NETbbbb光盘中Api\Demo\VBASIC32\CIFUSER.BAS模板文件复制到VB工程中并取消只读属性;添加到工程中,打开CIFUSER.BAS模板,加入以下常数申明:
'新增常数
Public Const TASK_TDT_UINT8 = 5
Public Const TASK_TFC_READ = 1
Public Const TASK_TFC_WRITE = 2
2、 新建模块Module1,添加以下公共变量和API函数:
Public Const usSize = 288 '消息长度常数=288
Public SndMsgRead As MSG_STRUC '读取MW0数据的消息
Public SndMsgWrite As MSG_STRUC '写MWO数据的消息
Public SndMsgReset As MSG_STRUC '复位NETbbbb的消息
Public RcvMsg As MSG_STRUC '接收消息
'内存拷贝API
Public Declare Sub CopyMemory Lib "kernel32" Alias"RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length AsLong)
3、 在bbbb1代码窗口中添加读写控制变量、三个消息初始化函数、NETbbbb链接和读写函数(请参考Nlmpi_pie.pdf文件):
Dim bNetbbbb_Connected As Boolean 'NETbbbb链接标记
Dim bStartRead As Boolean '开始循环读取标记
Dim bWrite As Boolean '写数据标记
'初始化读MW0数据的消息
Private Function Initial_SndMsgRead()
SndMsgRead.rx = 3 '接收号=3
SndMsgRead.tx = 255 '发送号=255
SndMsgRead.ln = 8 '读数据长度=8
SndMsgRead.nr = 0 '消息号
SndMsgRead.a = 0 '应答号=0
SndMsgRead.f = 0 '错误号=0
SndMsgRead.b = 0 '命令码=16#33(M区数据)
SndMsgRead.e = 0 '扩展号=0
SndMsgRead.data(0) = 2 'S7300CPU的MPI地址=2
SndMsgRead.data(1) = 0 '数据区=0
SndMsgRead.data(2) = 0 'M区起始地址=0(起始地址 MOD 256)
SndMsgRead.data(3) = 0 'M区起始地址=0(起始地址 / 256)
SndMsgRead.data(4) = 0 '数据索引=0(仅用于DB区)
SndMsgRead.data(5) = 2 '读取的字节数=2(MW0)
SndMsgRead.data(6) = TASK_TDT_UINT8 '数据类型=TASK_TDT_UINT8(字节)
SndMsgRead.data(7) = TASK_TFC_READ '功能号=TASK_TFC_READ(读数据)
End Function
'初始化写MW0数据的消息
Private Function Initial_SndMsgWrite()
SndMsgWrite.rx = 3 '接收号
SndMsgWrite.tx = 255 '发送号
SndMsgWrite.ln = 10 '写数据长度=10
SndMsgWrite.nr = 0 '消息号
SndMsgWrite.a = 0 '应答号=0
SndMsgWrite.f = 0 '错误号=0
SndMsgWrite.b = 0 '命令码=16#33(M区数据)
SndMsgWrite.e = 0 '扩展号=0
SndMsgWrite.data(0) = 2 'S7300CPU的MPI地址=2
SndMsgWrite.data(1) = 0 '数据区=0
SndMsgWrite.data(2) = 0 'M区起始地址=0(起始地址 MOD 256)
SndMsgWrite.data(3) = 0 'M区起始地址=0(起始地址 / 256)
SndMsgWrite.data(4) = 0 '数据索引=0(仅用于DB区)
SndMsgWrite.data(5) = 0 '要写的字节数=2(MW0)
SndMsgWrite.data(6) = TASK_TDT_UINT8 'TASK_TDT_UINT8
SndMsgWrite.data(7) = TASK_TFC_WRITE 'TASK_TFC_WRITE
SndMsgWrite.data(8) = 0 '待写数据低字节=0
SndMsgWrite.data(9) = 0 '待写数据高字节=0
End Function
'初始化复位NETbbbb消息
Private Function Initial_SndMsgReset()
SndMsgReset.rx = 0 '接收号=0(NETbbbb 系统)
SndMsgReset.tx = 255 '发送号
SndMsgReset.ln = 1 '数据长度
SndMsgReset.nr = 1 '消息号
SndMsgReset.a = 0 '应答号=0
SndMsgReset.f = 0 '错误号=0
SndMsgReset.b = 1 '命令码=1
SndMsgReset.e = 0 '扩展号=0
SndMsgReset.data(0) = 1 '=1
End Function
'NETbbbb链接
Private Function Netbbbb_Connect()
Dim sRet As Integer
sRet = DevOpenDriver(0) '打开驱动
If sRet = DRV_NO_ERROR Then
sRet= DevInitBoard(0,0) '初始化板卡
IfsRet = DRV_NO_ERROR Then
bNetbbbb_Connected =True '设置NETbbbb链接标记
Else
MsgBox "找不到NETbbbb!", vbCritical + vbOKOnly, "错误"
DevExitBoard0 '退出板卡
DevCloseDriver0 '关闭驱动
EndIf
Else
MsgBox "找不到NETbbbb驱动!", vbCritical + vbOKOnly, "错误"
DevExitBoard 0
DevCloseDriver 0
End If
End Function
'读MW0数据
Private Function ReadValue()
Dim sRet As Integer, RcvData(0 To 1) As Byte, Val_INT16 AsInteger
sRet = DevPutMessage(0, SndMsgRead, 500) '发送读取数据的消息
If sRet = DRV_NO_ERROR Then '如果发送消息无错误
sRet= DevGetMessage(0, usSize, RcvMsg, 500) '接收返回消息
'如果接收无错误且消息无错误且功能号为读取消息则接收消息中的MW0数据
IfsRet = DRV_NO_ERROR And RcvMsg.f = 0 And RcvMsg.data(7) =TASK_TFC_READ Then
RcvData(0) =RcvMsg.data(9) '注意高低字节的颠到
RcvData(1) = RcvMsg.data(8)
CopyMemory Val_INT16, RcvData(0), 2
Text_Value.Text = Val_INT16
EndIf
End If
End Function
'写MW0数据
Private Function Writbbbbue()
Dim sRet As Integer, SndData(0 To 1) As Byte, Val_INT16 AsInteger
Val_INT16 = Int(Text_Setting.Text)
CopyMemory SndData(0), Val_INT16, 2
SndMsgWrite.data(8) = SndData(1) '注意高低字节的颠到
SndMsgWrite.data(9) = SndData(0)
sRet = DevPutMessage(0, SndMsgWrite, 500) '发送写数据的消息
End If
bWrite = False '复位写值标志
End Function
4、 在bbbb1添加定时器Timer1,设定周期为100ms;在Timer1的执行事件中添加以下代码:
'定时器1的执行代码
Private Sub Timer1_Timer()
If bNetbbbb_Connected = FalseThen '如果Netbbbb没有链接则退出定时器执行
ExitSub
End If
If bWrite = True Then '如果有写值请求
Writbbbbue '写MW0值
ElseIf bStartRead = True Then '否则检查是否启动了读循环
ReadValue '读MW0值
End If
End Sub
5、 添加[循环读取]、[停止]、[写入新值]、[复位NETbbbb]按钮的动作
'循环读取按钮
Private Sub Command_read_Click()
If bNetbbbb_Connected = False Then '如果NETbbbb未链接
Netbbbb_Connect '链接NETbbbb
End If
If bNetbbbb_Connected = True Then '如果已链接
bStartRead =True '启动循环读
End If
End Sub
'停止按钮
Private Sub Command_stop_Click()
bStartRead = False
End Sub
'写入新值按钮
Private Sub Command_set_Click()
If IsNumeric(Text_Setting.Text) Then
bWrite = True
Else
MsgBox "设定值错误,范围:-32768至32767", vbExclamation + vbOKOnly,"格式错误"
End If
End Sub
'复位NETbbbb按钮
Private Sub Command_reset_Click()
Dim sRet As Integer
If bStartRead = True Then
MsgBox "复位NETbbbb前请先停止循环读取。", vbInbbbbation + vbOKOnly,"提示"
Else
sRet= DevPutMessage(0, SndMsgReset,500) '发送复位NETbbbb的消息
End If
End Sub
6、 在bbbb1的Load事件中添加初始化代码:
'bbbb1装载
Private Sub bbbb_Load()
bStartRead = False
bWrite = False
bNetbbbb_Connected = False
Text_Value.Text = 0
Text_Setting.Text = 0
Initial_SndMsgRead '初始化读取数据消息
Initial_SndMsgWrite '初始化写值消息
Initial_SndMsgReset '初始化复位消息
Netbbbb_Connect '链接NETbbbb
End Sub
六、注意事项
1、 注意发送消息中的数据起始地址的高低字节颠到和接收消息中数据区的高低字节颠到;
2、 定时器事件在操作系统繁忙时容易被中断执行,可以适当提高进程和线程的优先级来保证数据的更新速率,在bbbb_Load()中添加以下代码:
Dim hThread As Long, hProcess As Long
hThread = GetCurrentThread
hProcess = GetCurrentProcess
SetThreadPriority hThread, THREAD_PRIORITY_HIGHEST
SetPriorityClass hProcess, HIGH_PRIORITY_CLASS
在Module1中添加以下声明:
Public Const THREAD_BASE_PRIORITY_IDLE = -15
Public Const THREAD_BASE_PRIORITY_LOWRT = 15
Public Const THREAD_BASE_PRIORITY_MIN = -2
Public Const THREAD_BASE_PRIORITY_MAX = 2
Public Const THREAD_PRIORITY_LOWEST =THREAD_BASE_PRIORITY_MIN
Public Const THREAD_PRIORITY_HIGHEST =THREAD_BASE_PRIORITY_MAX
Public Const THREAD_PRIORITY_BELOW_NORMAL =(THREAD_PRIORITY_LOWEST + 1)
Public Const THREAD_PRIORITY_ABOVE_NORMAL =(THREAD_PRIORITY_HIGHEST - 1)
Public Const THREAD_PRIORITY_IDLE =THREAD_BASE_PRIORITY_IDLE
Public Const THREAD_PRIORITY_NORMAL = 0
Public Const THREAD_PRIORITY_TIME_CRITICAL =THREAD_BASE_PRIORITY_LOWRT
Public Const HIGH_PRIORITY_CLASS = &H80
Public Const IDLE_PRIORITY_CLASS = &H40
Public Const NORMAL_PRIORITY_CLASS = &H20
Public Const REALTIME_PRIORITY_CLASS = &H100
Public Declare Function SetThreadPriority Lib "kernel32" (ByValhThread As Long, ByVal nPriority As Long) As Long
Public Declare Function SetPriorityClass Lib "kernel32" (ByValhProcess As Long, ByVal dwPriorityClass As Long) As Long
3、 无论是读取数据还是写数据,发送和接收消息函数必须成对出现;
4、 在实际的通讯中如果网络中断(譬如交换机断电,插拔网络插头)将会导致发送和接收消息函数出错,其返回值sRet大于等于10000(网络错误),此时需要主动发出NETbbbb复位消息;发出复位消息后一般需要等待5秒钟后进行链接;
5、 在每次尝试NETbbbb链接前为了避免找不到NETbbbb导致的驱动函数超时返回,可以先采用NetIdent协议(参考Ni_pie.pdf文件,使用Winsock控件)广播网络上的NETbbbb,找到NETbbbb后再尝试链接,这样可以提高通讯效率;
6、 一次读取地址连续的数据包(不要超过240个字节)比多次读取单个数据的效率要高的多;
7、 发送和返回的响应消息的消息号Nr是对应的,可以用Nr来判断多个读写任务的响应消息;