Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Für die Verwendung mehrerer Geräte ist das mehrfache Aufrufen der xChannelOpen-Funktion erforderlich. Über den szBoard-Parameter können dabei jeweils unterschiedliche Geräte selektiert werden. Dabei entstehenden Handles beziehen sich jeweils auf die unterschiedlichen Geräte. Daher sollte diese im weiteren Verlauf der Applikation immer selektiv behandelt werden. Ein mehrfaches Öffnen des Treibers über xDriverOpen ist nicht erforderlich.


Code Block
languagecpp
titleQuellcode
/*****************************************************************************/
/*! Function to demonstrate communication channel functionality
*   Packet Transfer and I/O Data exchange
*   \return CIFX_NO_ERROR on success                                         */
/*****************************************************************************/
long ChannelDemo(HANDLE hDriver, char* szBoard[], uint32_t ulChannel[], uint32_t channelCount)
{
  HANDLE* hChannels;
  hChannels = malloc(channelCount * 4);

  HANDLE hChannel       = NULL;
  long   lRet           = CIFX_NO_ERROR;

  for (uint32_t i = 0; i < channelCount; i++) {

      printf("---------- Communication Channel demo ----------\r\n");
      lRet = xChannelOpen(hDriver, szBoard, ulChannel, &hChannel);
      if (CIFX_NO_ERROR != lRet)
      {
          printf("Error opening Channel!");
      }
      else
      {
          ...
		  ...
		  ...
		  
		  /* Set Host Ready to signal the filed bus an application is ready */
          lRet = xChannelHostState(hChannel, CIFX_HOST_STATE_READY, &ulState, HOSTSTATE_TIMEOUT);

          if (CIFX_NO_ERROR != lRet)
          {
              printf("Error setting host ready!\r\n");
          }
          else
          {
              /* Switch on the bus if it is not automatically running (see configuration options) */
              lRet = xChannelBusState(hChannel, CIFX_BUS_STATE_ON, &ulState, 0L);

              if (CIFX_NO_ERROR != lRet)
              {
                  printf("Unable to start the filed bus!\r\n");
              }
              else
              {
                  DWORD dwThreadID = 0;
                  hAppThreads[i] = CreateThread( NULL, 0, IODataHandler, hChannels[i], 0, &dwThreadID);
              }
          }
      }

      /* Wait for all threads terminated */
      lRet = WaitForMultipleObjects(channelCount, hAppThreads, TRUE, INFINITE);

      /* Close all Channel-Handler */
      for (uint32_t i = 0; i < channelCount; i++) {
          xChannelClose(ulChannel[i]);
      }
      free(hChannels);

  }
}


Multiple-Application

Ob ein Betrieb mehrerer Applikationen mit einem COMSOL-Device möglich ist, hängt wesentlich vom verwendeten Treiber ab. Grundsätzlich müssen mehrere Instanzen der Applikation bzw. des Treibers einander bekannt sein, dass Sperrmechanismen für die verwendeten Ressourcen greifen.

...