Здесь показан простейший pvserver для работы с PROFIBUS. Доступ реализован с помощью rlHilscherCIF из библиотеки rllib.
//***************************************************************************
// main.cpp - description
// -------------------
// begin : Mi Feb 14 10:18:44 2007
// generated by : pvdevelop (C) 2000-2006 by Lehrig Software Engineering
// email : lehrig@t-online.de
//***************************************************************************
#include "pvapp.h"
// todo: comment me out. you can insert these objects as extern in your masks.
//rlModbusClient modbus(modbusdaemon_MAILBOX,modbusdaemon_SHARED_MEMORY,modbusdaemon_SHARED_MEMORY_SIZE);
//rlSiemensTCPClient siemensTCP(siemensdaemon_MAILBOX,siemensdaemon_SHARED_MEMORY,siemensdaemon_SHARED_MEMORY_SIZE);
//rlPPIClient ppi(ppidaemon_MAILBOX,ppidaemon_SHARED_MEMORY,ppidaemon_SHARED_MEMORY_SIZE);
#include "rlhilschercif.h"
rlHilscherCIF cif;
unsigned char sendData[512];
unsigned char receiveData[512];
rlThread pbus;
void *profibus(void *arg)
{
THREAD_PARAM *p = (THREAD_PARAM *) arg;
cif.debug = 1;
if(cif.open() == DRV_NO_ERROR)
{
cif.debug = 0;
while(p->running)
{
rlsleep(50);
pbus.lock();
cif.devExchangeIO(0,4,sendData,
0,4,receiveData,
1000);
pbus.unlock();
}
}
return arg;
}
int pvMain(PARAM *p)
{
int ret;
pvSetCaption(p,"pvs");
pvResize(p,0,1280,1024);
//pvScreenHint(p,1024,768); // this may be used to automatically set the zoomfactor
ret = 1;
pvGetInitialMask(p);
if(strcmp(p->initial_mask,"mask1") == 0) ret = 1;
while(1)
{
switch(ret)
{
case 1:
pvStatusMessage(p,-1,-1,-1,"mask1");
ret = show_mask1(p);
break;
default:
return 0;
}
}
}
#ifdef USE_INETD
int main(int ac, char **av)
{
PARAM p;
pvInit(ac,av,&p);
/* here you may interpret ac,av and set p->user to your data */
pvMain(&p);
return 0;
}
#else // multi threaded server
int main(int ac, char **av)
{
PARAM p;
int s;
pvInit(ac,av,&p);
/* here you may interpret ac,av and set p->user to your data */
memset(sendData,0,sizeof(sendData));
memset(receiveData,0,sizeof(receiveData));
pbus.create(profibus,NULL);
while(1)
{
s = pvAccept(&p);
if(s != -1) pvCreateThread(&p,s);
else break;
}
return 0;
}
#endif
//###############################################################
// todo: uncomment me if you want to use this data aquisiton
// also uncomment this classes in main.cpp and pvapp.h
// also remember to uncomment rllib in the project file
//extern rlModbusClient modbus;
//extern rlSiemensTCPClient siemensTCP;
//extern rlPPIClient ppi;
extern unsigned char sendData[512];
extern unsigned char receiveData[512];
extern rlThread pbus;
typedef struct // (todo: define your data structure here)
{
}
DATA;
static int slotInit(PARAM *p, DATA *d)
{
if(p == NULL || d == NULL) return -1;
//memset(d,0,sizeof(DATA));
return 0;//###
}
static int slotNullEvent(PARAM *p, DATA *d)
{
if(p == NULL || d == NULL) return -1;
pvPrintf(p,labelInput0,"%2X",receiveData[0]);
pvPrintf(p,labelInput1,"%2X",receiveData[1]);
return 0;
}
<snip>
static int slotSliderEvent(PARAM *p, int id, DATA *d, int val)
{
if(p == NULL || id == 0 || d == NULL || val < -1000) return -1;
pbus.lock();
if(id == spinOutput0) sendData[0] = val;
if(id == spinOutput1) sendData[1] = val;
pbus.unlock();
return 0;
}
//*************************************************************************** // pvapp.h - description // ------------------- // begin : Mi Feb 14 10:18:44 2007 // generated by : pvdevelop (C) 2000-2006 by Lehrig Software Engineering // email : lehrig@t-online.de //*************************************************************************** #ifndef _PVAPP_H_ #define _PVAPP_H_ #include "processviewserver.h" #include "rltime.h" #include "rlthread.h" // todo: comment me out //#include "rlmodbusclient.h" //#include "rlsiemenstcpclient.h" //#include "rlppiclient.h" //#include "modbusdaemon.h" // this is generated //#include "siemensdaemon.h" // this is generated //#include "ppidaemon.h" // this is generated int show_mask1(PARAM *p); #endif