ODK
Богдан Кудлак; 28.11.00



В своем приложении я могу по какому-то запросу (таймер, кнопка)
читать или передавать значения в WinCC.

Dim Mcp As Object
Set Mcp = CreateObject("WinCC-Runtime-Project")
Wert = Mcp.GetValue(fy1)
success = Mcp.SetValue(var_name(z), dm_var)

А как сделать, чтобы при каком-то событии (например изменении тега),
WinCC сам передавал данные моему приложению?



Re: ODK
Шестаков Сергей, ООО "Профиль" Ст.Оскол; 30.11.00

Уважаемый Богдан!


Что касается DDE-обмена, просмотрите раздел справочной системы WinCC - "DDE-server/Local DDE-connection". Я проверял обмен с EXCEL, работает нормально. Хотя WinCC запускает свой DDE-server, тем не менее приложения Windows видят его нормально, хотя в Windows NT существует менеджер
DDESHARE, показывающий активные DDE-серверы, который не понимает DDE-сервер WinCC. Из-за этого не всегда корректно работает(а иногжа и совсем не работает)NetDDE.

С уважением
Шкстаков Сергей
Re: ODK
Василенко П; 19.1.01

Может я не то отвечаю на другой вопрос, но в ODK для многих вещей есть CALLBACK-функции входы в пользовательское приложение, используемое WINCC по разным поводам например для реакции на изменение тегов кусок реальной программы:


...
void CGetPrijInfoDlg::OnGetInfo()
{
static int m_User = 103; // key
PCMN_ERROR pError = &err; // Global Error Block
m_straVarNames.RemoveAll();
ZeroMemory( &dmVarFilter, sizeof(DM_VARFILTER));
ZeroMemory(pError, sizeof(CMN_ERROR));
dmVarFilter.dwFlags = DM_VARFILTER_GROUP;
dmVarFilter.lpszGroup = __T("ExportTags");
dwCycle = 0;
hDlg = m_hWnd;
if (!DMConnect(AppName, DmgNotifyCon, &m_User, pError))
MessageBox(err.szErrorText, NULL, MB_OK);
if (!DMGetRuntimeProject(project, (DWORD)sizeof(project), &err))
MessageBox(err.szErrorText, NULL, MB_OK);
if(!DMEnumVariables((LPSTR)(LPCTSTR) project, &dmVarFilter, EnumVariablesProc,
&m_User, &err))
MessageBox(err.szErrorText, NULL, MB_OK);
if(!DMBeginStartVarUpdate(&dwTAID, pError))
MessageBox(err.szErrorText, NULL, MB_OK);
nNum = m_straVarNames.GetSize();
lpdmVarKey = GetVarKeys();
SetDlgItemText(IDC_STATIC_NAME1,lpdmVarKey[0].szName);
SetDlgItemText(IDC_STATIC_NAME2,lpdmVarKey[1].szName);
SetDlgItemText(IDC_STATIC_NAME3,lpdmVarKey[2].szName);
SetDlgItemText(IDC_STATIC_NAME4,lpdmVarKey[3].szName);
SetDlgItemText(IDC_STATIC_NAME5,lpdmVarKey[4].szName);

if(!DMGetVarInfo (project, lpdmVarKey, nNum, &err))
MessageBox(err.szErrorText, NULL, MB_OK);
for( int i=0; i<nNum; i++)
IDNum[i] = lpdmVarKey[i].dwID;

if(!DMStartVarUpdate(dwTAID, lpdmVarKey, nNum,dwCycle,
NotifyVariableProc, &m_User, pError))
MessageBox(err.szErrorText, NULL, MB_OK);
if(!DMEndStartVarUpdate(dwTAID, pError))
MessageBox(err.szErrorText, NULL, MB_OK);
}

...