Na našem webu jsme zveřejnili příklad práce s X2CAN API a převodníkem USB2CAN Triple z programovacího jazyka Java. Pro zjednodušení práce a řešení problémů se správným zarovnáním a velikostí položek struktur dostalo X2CAN API drobné rozšíření, které odstiňuje programátora od reálného tvaru struktury CAN bus zprávy. Potřebné funkce jsou obsaženy v headeru "helper_message.h". Nalézá se tu sada funkcí, která dovoluje alokovat a dealokovat paměť pro zprávu, nastavovat a číst jednotlivé položky a podobně. Práce je pak mnohem pohodlnější a použití X2CAN API z jiných programovacích jazyků snazší. Taktéž došlo na doplnění možnosti práce s více převodníky a alokaci prostoru pro data převodníku pomocí indexu místo ukazatele (PrepareAdapterXXX, SelectActualAdapterXXX).
Příklad práce s X2CAN API z jazyka Java používá pro práci s DLL techniku JNA. Určen je pro Windows a Visual Studio Code.
Toto rozšíření také dovoluje snazší práci s převodníkem například z některých HMI / SCADA softwarů. Příkladem je software DAQFactory s omezeným množstvím datových typů a praktickou nemožností rozumně pracovat se strukturou CAN_MESSAGE a jejími položkami. Sequence, která inicializuje převodník USB2CAN a odešle 3 zprávy na CAN bus ze software DAQFactory vypadá takto:
extern("e:\DAQFactory\X2CAN_3th_dll.dll","ulong USB2CAN_PrepareAdapterByIndex()","USB2CAN_PrepareAdapterByIndex","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_SelectActualAdapterByIndex(ulong)","USB2CAN_SelectActualAdapterByIndex","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_OpenSimple(long)","USB2CAN_OpenSimple","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","void USB2CAN_CloseAllIndexed()","USB2CAN_CloseAllIndexed","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ulong X2CAN_PrepareStandardMessage(ulong,ubyte,ubyte,ulong,ulong)","X2CAN_PrepareStandardMessage","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte X2CAN_SetDataByte(ulong,ubyte,ubyte)","X2CAN_SetDataByte","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_SendCANMessageP(ulong)","USB2CAN_SendCANMessageP","stdcall") USB2CAN_CloseAllIndexed(); global can_adapter = USB2CAN_PrepareAdapterByIndex() USB2CAN_SelectActualAdapterByIndex(can_adapter) USB2CAN_OpenSimple(250) global message = X2CAN_PrepareStandardMessage(111,0,8,1,0) X2CAN_SetDataByte(message,0,0) X2CAN_SetDataByte(message,1,11) X2CAN_SetDataByte(message,2,22) X2CAN_SetDataByte(message,3,33) X2CAN_SetDataByte(message,4,44) X2CAN_SetDataByte(message,5,55) X2CAN_SetDataByte(message,6,66) X2CAN_SetDataByte(message,7,77) USB2CAN_SendCANMessageP(message) X2CAN_SetDataByte(message,0,1) USB2CAN_SendCANMessageP(message) X2CAN_SetDataByte(message,0,2) USB2CAN_SendCANMessageP(message) delay(1) USB2CAN_CloseAllIndexed();
V případě převodníku USB2CAN Triple je řešení podobné:
extern("e:\DAQFactory\X2CAN_3th_dll.dll","ulong USB2CAN_TRIPLE_PrepareAdapterByIndex(long)","USB2CAN_TRIPLE_PrepareAdapterByIndex","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_TRIPLE_SelectActualAdapterByIndex(ulong)","USB2CAN_TRIPLE_SelectActualAdapterByIndex","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_TRIPLE_OpenSimple(long)","USB2CAN_TRIPLE_OpenSimple","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_TRIPLE_Close()","USB2CAN_TRIPLE_Close","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_TRIPLE_PrepareAdapterSpeedC1ByIndex(ulong,long,ubyte)","USB2CAN_TRIPLE_PrepareAdapterSpeedC1ByIndex","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_TRIPLE_PrepareAdapterSpeedC2ByIndex(ulong,long,ubyte)","USB2CAN_TRIPLE_PrepareAdapterSpeedC2ByIndex","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_TRIPLE_PrepareAdapterSpeedC3ByIndex(ulong,long,ubyte,ubyte,ubyte)","USB2CAN_TRIPLE_PrepareAdapterSpeedC3ByIndex","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_TRIPLE_SendStandardMessage(word,byte,byte,long)","USB2CAN_TRIPLE_SendStandardMessage","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_TRIPLE_SendExtendedMessage29(long,byte,byte,long)","USB2CAN_TRIPLE_SendExtendedMessage29","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","void USB2CAN_TRIPLE_CloseAllIndexed()","USB2CAN_TRIPLE_CloseAllIndexed","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ulong X2CAN_PrepareStandardMessage(ulong,ubyte,ubyte,ulong,ulong)","X2CAN_PrepareStandardMessage","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte X2CAN_SetDataByte(ulong,ubyte,ubyte)","X2CAN_SetDataByte","stdcall") extern("e:\DAQFactory\X2CAN_3th_dll.dll","ubyte USB2CAN_TRIPLE_SendCANMessageP(ulong)","USB2CAN_TRIPLE_SendCANMessageP","stdcall") USB2CAN_TRIPLE_CloseAllIndexed(); global can_adapter = USB2CAN_TRIPLE_PrepareAdapterByIndex(-1) USB2CAN_TRIPLE_SelectActualAdapterByIndex(can_adapter) USB2CAN_TRIPLE_PrepareAdapterSpeedC1ByIndex(can_adapter, 250, 0) USB2CAN_TRIPLE_PrepareAdapterSpeedC2ByIndex(can_adapter, 250, 0) USB2CAN_TRIPLE_PrepareAdapterSpeedC3ByIndex(can_adapter, 250, 0, 0, 1) USB2CAN_TRIPLE_OpenSimple(250) global message = X2CAN_PrepareStandardMessage(111,0,8,1,0) X2CAN_SetDataByte(message,0,0) X2CAN_SetDataByte(message,1,11) X2CAN_SetDataByte(message,2,22) X2CAN_SetDataByte(message,3,33) X2CAN_SetDataByte(message,4,44) X2CAN_SetDataByte(message,5,55) X2CAN_SetDataByte(message,6,66) X2CAN_SetDataByte(message,7,77) USB2CAN_TRIPLE_SendCANMessageP(message) X2CAN_SetDataByte(message,0,1) USB2CAN_TRIPLE_SendCANMessageP(message) X2CAN_SetDataByte(message,0,2) USB2CAN_TRIPLE_SendCANMessageP(message) delay(1) USB2CAN_TRIPLE_CloseAllIndexed();
Za zmínku stojí nové funkce USB2CAN_CloseAllIndexed / USB2CAN_TRIPLE_CloseAllIndexed. Ty jsou volány i na začátku sekvence před inicializací a otevřením převodníku. Tyto funkce uvolní převodník nebo převodníky, které zůstaly otevřeny při debugování sekvence v DAQFactory, pokud byla sekvence přerušena a převodník nebyl korektně uzavřen. Delay na konci sekvence je v tomto případě nutný, aby se před uzavřením stihla zpráva odeslat. V praxi nebude otevření / uzavření a odesílání dat součástí jedné sequence, ale otevření bude voláno pouze na začátku po spuštění SCADA aplikace, stejně tak uzavření převodníku na konci. Odesílání dat ze sekvencí za běhu žádný delay nevyžaduje.
Veškeré novinky jsou součástí X2CAN API verze 3.019, které je k dispozici ke stažení pro uživatele kteří jej zakoupili.