在柔性制造FMS系统中,本次项目以西门子PLC300,PLC200和倍加福RFID构建自动化输送和立体仓库物流方案。
硬件:
1、一个西门子PLC300为主站,四个PLC200为从站
2、倍加福RFID IC-KP-B17-AIDA1 IDENTControl interface with Ethernet interface的识别系统
系统:
因为西门子PLC,选用WinCC做组态画面,VBS实现MES/WMS的功能。
课题:
因为首次选用带TCP/IP的倍加福RFID,需要解决其与WinCC的通讯问题。
倍加福RFID有两种方式可以进行通讯,一、DLL,通过加载和调用所提供的DLL进行通讯;二、TCP的Socket进行通讯。
首先尝试了DLL,在WinCC中是可以调用DLL的,尝试了一个简单的DLL进行测试。
在WinCC图形编辑器中添加一个按钮,2个输入输出框。在按钮点击事件中创建以下代码:
#include "apdefap.h"
void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y)
{
#pragma code ("c:/DLL/T1_C.dll") //指定绝对路径,网上有说放在WinCC/bin目录的,好像不靠谱还是这样好。
int aufruf1(int a); //声明函数
#pragma code ()
int value;
value = GetTagDouble("var1"); //Return-Type: double
SetTagDouble("result",aufruf1(value)); //Return-Type: BOOL
}
其中T1_C.dll里有一个返回参数+100的aufruf1函数。详见 http://www.cnblogs.com/ohiolee/articles/3498381.html
但是倍加福提供的RFID_TCP_DLL及示例代码是C++的,没怎么弄明白要怎么声明里面的函数,还有类的问题。代码如下:
/* in your c++ header file */
#include "RFIDTCP.h"
#pragma comment(lib, "..\\impDLL\\PF_RFID_LIB.lib")
/* in your c++ CPP file */
void RFID_test()
{
int ret;
RFIDTCP *pRFIDTCP;
pRFIDTCP=new RFIDTCP;
rfidMSG *pRfidMSG;
pRfidMSG= new rfidMSG;
pRFIDTCP->setupDevice("192.168.40.119",2);
int startAddr=0;
int wordNum=0;
int channel;
int ms_BlocTimeout=1000;
int retStatus;
channel=1;
pRFIDTCP->connectDevice(ms_BlocTimeout);
/* CT Test */
pRfidMSG->reset();
ret=pRFIDTCP->rfidCT(channel,pRfidMSG->pMsgBuff,"21",&retStatus);
TRACE("CT [ret=%d][%s][status=%d]\n",ret,pRfidMSG->pString,retStatus);
startAddr=0;
wordNum=26/4+1;
Sleep(500);
/* SW Test */
pRfidMSG->reset();
ret=pRFIDTCP->rfidSW(channel,startAddr,wordNum,pRfidMSG->pMsgBuff,"zyxvwutsrqponmlkjihgfedcba",&retStatus);
TRACE("SW [ret=%d][%s][status=%d]\n",ret,pRfidMSG->pString,retStatus);
/* SR Test */
pRfidMSG->reset();
ret=pRFIDTCP->rfidSR(channel,startAddr,wordNum,pRfidMSG->pMsgBuff,&retStatus);
TRACE("SR [ret=%d][%s][status=%d]\n",ret,pRfidMSG->pString,retSta