// HWEvents.cpp : Defines the entry point for the console application. // // Sensor/Aktor-Systeme LU // Demoprogramm: Hardware Events // Liest via Profibus-DP ein Byte von der CP242-8 aus und schreibt dieses // via Profibus-DP zurück #include "stdafx.h" #include "dp_5613.h" #include "5613_ret.h" #include int _tmain(int argc, _TCHAR* argv[]) { DPR_STRING *pCP_Name="CP_L2_1:"; // Logischer Name des CP DPR_STRING *pDatabase= NULL; // Pfad und Name der Datenbasis (NULL Default) DP_ERROR_T ErrStruct; // Details zur Fehlerursache DPR_DWORD RetErrClass; DPR_STRING *pErrLanguage="German"; // Sprache des auszugebenden Fehlertextes DPR_STRING ErrorText[DP_ERR_TXT_SIZE]; // Datenbereich für Fehlertext DPR_DWORD DPUserHandle; // User Handle für Anwenderprogramm DPR_CP5613_DP_T volatile *pDPRam; // Zugriff auf Dual Ported RAM DPR_DWORD DPSemaHandle; // Semaphorobjekt DPR_BYTE DP_Data[2]; // Nutzdaten DPR_BYTE old_mode; printf("DP_start_cp\n"); // DP_start_cp: Laden der Firmware und der Datenbasis in den CP 5613 // CP_NAME: logischer Name des CP (CP_L2_1:) // pPathName: Pfad und Name der Datenbasis (NULL Default) // ErrStruct: Details zur Fehlerursache RetErrClass = DP_start_cp(pCP_Name, pDatabase, &ErrStruct); if ((RetErrClass != DP_OK) && (ErrStruct.error_code != CI_RET_START_ALREADY_DONE)) { (void)DP_get_err_txt(&ErrStruct, pErrLanguage, ErrorText); printf("%s\n",ErrorText); return -1; } printf("DP_open_cp\n"); // DP_open: Anmelden eines DP-Anwenderprogramms // CP_NAME: logischer Name des CP (CP_L2_1:) // DPUser_Handle: Vergabe eines User-Handle // ErrStruct: Details zur Fehlerursache RetErrClass = DP_open(pCP_Name, &DPUserHandle, &ErrStruct); if (RetErrClass != DP_OK) { (void)DP_get_err_txt(&ErrStruct, pErrLanguage, ErrorText); printf("%s\n",ErrorText); return -1; } printf("DP_get_pointer\n"); // DP_get_pointer: Exklusiver Zugriff auf das Prozessabbild // DPUser_Handle: User-Handle, das beim Aufruf DP_open vergeben wurde // DP_TIMEOUT_FOREVER: Dauer der maximalen Wartezeit ("unendlich") // pDPRam: Zugriffsadresse auf das Prozessabbild des CP 5613 // ErrStruct: Details zur Fehlerursache RetErrClass = DP_get_pointer(DPUserHandle, 5000, &pDPRam, &ErrStruct); if (RetErrClass != DP_OK) { (void)DP_get_err_txt(&ErrStruct, pErrLanguage, ErrorText); printf("%s\n",ErrorText); return -1; } for (int i=1; i < 4; i++) { // DP_set_mode: Einstellen des gewünschten DP-Zustand (OFFLINE, STOP, CLEAR, OPERATE) // DPUser_Handle: User-Handle, das beim Aufruf DP_open vergeben wurde // Mode: OFFLINE-, STOP-, CLEAR, OPERATE-Zustand // ErrStruct: Details zur Fehlerursache printf("DP_set_mode"); switch (i) { case 0: RetErrClass = DP_set_mode(DPUserHandle, DP_OFFLINE, &ErrStruct); break; case 1: old_mode=DP_OFFLINE; RetErrClass = DP_set_mode(DPUserHandle, DP_STOP, &ErrStruct); break; case 2: old_mode=DP_STOP; RetErrClass = DP_set_mode(DPUserHandle, DP_CLEAR, &ErrStruct); break; case 3: old_mode=DP_CLEAR; RetErrClass = DP_set_mode(DPUserHandle, DP_OPERATE, &ErrStruct); break; } if (RetErrClass != DP_OK) { (void)DP_get_err_txt(&ErrStruct, pErrLanguage, ErrorText); printf("%s\n",ErrorText); return -1; } while (old_mode == pDPRam->info_watch.master_info.USIF_state) ; switch (pDPRam->info_watch.master_info.USIF_state) { case DP_OFFLINE: printf(" OFFLINE\n"); break; case DP_STOP: printf(" STOP\n"); break; case DP_CLEAR: printf(" CLEAR\n"); break; /*case DP_AUTOCLEAR: printf(" AUTOCLEAR\n"); break;*/ case DP_OPERATE: printf(" OPERATE\n"); break; } } printf("DP_init_sema_object\n"); // DP_init_sema_object: Anlegen eines Semaphors // DPUser_Handle: User-Handle, das beim Aufruf DP_open vergeben wurde // DP_OBJECT_TYPE_INPUT_CHANGE: Hardware-Event bei Änderung von Slave-Eingabedaten // DPSemaHandle: Semaphor Objekt // ErrStruct: Details zur Fehlerursache RetErrClass = DP_init_sema_object(DPUserHandle, DP_OBJECT_TYPE_INPUT_CHANGE, &DPSemaHandle, &ErrStruct); if (RetErrClass != DP_OK) { (void)DP_get_err_txt(&ErrStruct, pErrLanguage, ErrorText); printf("%s\n",ErrorText); return -1; } DP_Data[0]=0xFF; for (;DP_Data[0] != 0x08;) { pDPRam->ef.input[1].req_mask = DPR_DATA_INT_CLEAR_AND_UNMASK; // WaitForSingleObject(DPSemaHandle, 0); WaitForSingleObject((HANDLE) DPSemaHandle, INFINITE); /* Sperren des Datenbereichs gegen Aktualisierung */ pDPRam->ctr.D_lock_in_slave_adr = 1; /* Daten kopieren */ memcpy(&DP_Data[0], (void*)(&(pDPRam->pi.slave_in[1].data[0])), 1); /* Sperre wieder aufheben */ pDPRam->ctr.D_lock_in_slave_adr = DPR_DP_UNLOCK; printf("Tasten gedrueckt: %X\n", DP_Data[0]); /* Daten kopieren */ memcpy((void*)&(pDPRam->pi.slave_out[1].data[0]), &DP_Data[0], 1); /* Übertragung anstoßen */ pDPRam->ctr.D_out_slave_adr = 1; } // todo: // DP_delete_sema_object: Löschen eines Semaphors // DPUser_Handle: User-Handle, das beim Aufruf DP_open vergeben wurde // DP_OBJECT_TYPE_INPUT_CHANGE: Hardware-Event bei Änderung von Slave-Eingabedaten // DPSemaHandle: Semaphor Objekt // ErrStruct: Details zur Fehlerursache // DP_set_mode: Einstellen des gewünschten DP-Zustand (OFFLINE, STOP, CLEAR, OPERATE) // DPUser_Handle: User-Handle, das beim Aufruf DP_open vergeben wurde // Mode: OFFLINE-, STOP-, CLEAR, OPERATE-Zustand // ErrStruct: Details zur Fehlerursache // DP_release_pointer: Freigabe der Zugriffsadresse auf das Prozessabbild des CP 5613 // DPUser_Handle: User-Handle, das beim Aufruf DP_open vergeben wur // ErrStruct: Details zur Fehlerursache // DP_close: Abmelden eines DP-Anwenderprogramms // DPUser_Handle: Rückgabe des User-Handle // ErrStruct: Details zur Fehlerursache // DP_reset_cp: Rücksetzen des CP 5613 // CP_NAME: logischer Name des CP (CP_L2_1:) // ErrStruct: Details zur Fehlerursache return 0; }