Knowledge Base Nr: 00056 s7blockopc.cpp - http://www.swe-kaiser.de

Downloads:

OPC: siemens s7 blockbefehle verarbeiten (safearrays)

  
BOOL CMyOPCClient::ReadData(CItem& cItem, unsigned char ucData[], int& nSize)
{
long lBound = 0;
long uBound = 0;

HRESULT hr;

SAFEARRAY* psa = cItem.m_varValue.parray;

hr = SafeArrayGetLBound(psa, 1, &lBound);
if(FAILED(hr))
{
sprintf(g_szLog, "ERROR: Daten können nicht gelesen werden (falsches S7 Format - SafeArrayGetLBound() failed)!\n");
DoLog(g_szLog);
return FALSE;
}

hr = SafeArrayGetUBound(psa, 1, &uBound);
if(FAILED(hr))
{
sprintf(g_szLog, "ERROR: Daten können nicht gelesen werden (falsches S7 Format - SafeArrayGetUBound() failed)!\n");
DoLog(g_szLog);
return FALSE;
}

VARIANT var;
VariantInit(&var);
VariantChangeType(&var, &var, 0, VT_UI1);

for(long i = lBound; i <= uBound; ++i)
{
long index = i;
unsigned char byte = 0;

hr = SafeArrayGetElement(psa, &index, &byte);
if(FAILED(hr))
{
sprintf(g_szLog, "ERROR: Daten können nicht gelesen werden (falsches S7 Format - SafeArrayGetElement() failed)!\n");
DoLog(g_szLog);
return FALSE;
}

ucData[i] = byte;
}

nSize = uBound;
return TRUE;
}

BOOL CMyOPCClient::SendeUhrzeit()
{
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 8;

SAFEARRAY* psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
if(psa == NULL)
{
sprintf(g_szLog, "ERROR: SendeUhrzeit() SAFEARRAY kann nicht angelegt werden!\n");
DoLog(g_szLog);
}

long ix = 0;
unsigned char byte = 0;

time_t now;
time(&now);
struct tm *nowtime = localtime( &now );

ix = 0; byte = nowtime->tm_year - 100; //jahr
SafeArrayPutElement(psa, &ix, &byte);
ix = 1; byte = nowtime->tm_mon + 1; //monat
SafeArrayPutElement(psa, &ix, &byte);
ix = 2; byte = nowtime->tm_mday; //tag
SafeArrayPutElement(psa, &ix, &byte);
ix = 3; byte = nowtime->tm_hour; //stunde
SafeArrayPutElement(psa, &ix, &byte);
ix = 4; byte = nowtime->tm_min; //minute
SafeArrayPutElement(psa, &ix, &byte);
ix = 5; byte = nowtime->tm_sec; //sekunde
SafeArrayPutElement(psa, &ix, &byte);
ix = 6; byte = 0; //msec high
SafeArrayPutElement(psa, &ix, &byte);
ix = 7; byte = 0; //msec low
SafeArrayPutElement(psa, &ix, &byte);

CItem cItem;

cItem.m_strName = ITEM_DB10;
cItem.m_varValue = (long)0;
cItem.m_varValue.vt = VT_ARRAY|VT_UI1;
cItem.m_varValue.parray = psa;

BOOL bSucc = WriteItem(VALUEGROUPNAME, cItem);

return bSucc;
}