LabWindows/CVI

cancel
Showing results for 
Search instead for 
Did you mean: 

write OPC client with LabWindows/CVI

Sure, I will but it will be 10 days later since I'm going on a travel. Thanks.

0 Kudos
Message 11 of 17
(1,500 Views)
Perry, I'm back from business trip. Just now I tried using ActiveX Array functions but it still won't work. My code is as follows. Any idea what's the problem? Thanks. Margaret int AsyncReadCompleteID=0; void GroupAsyncRead(void) { char *v_item; long *v_handle; OPCAutomationObj_OPCItems ppItems; OPCAutomationObj_OPCItem ppItem; long numItems, hvalue, i; SAFEARRAY *serverHandles, *errors; status = OPCAutomation_IOPCGroupGetOPCItems(OPCGroupHandle, &Error_Info, &ppItems); status = OPCAutomation_OPCItemsGetCount(ppItems, &Error_Info, &numItems); v_handle = (long *)malloc(sizeof(long)*numItems); for(i=0; i < numItems; i++) { status = OPCAutomation_OPCItemsItem(ppItems, &Error_Info, CA_VariantInt(i+1), &ppItem); // status = OPCAutomation_OPCItemGetItemID(ppItem, &Error_Info, &v_item); //verify status = OPCAutomation_OPCItemGetServerHandle(ppItem, &Error_Info, &hvalue); v_handle[i] = hvalue; } status = CA_Array1DToSafeArray(v_handle, CAVT_LONG, numItems, &serverHandles); //AsyncRead returns a negative value to status status = OPCAutomation_IOPCGroupAsyncRead(OPCGroupHandle, &Error_Info, numItems, &serverHandles, &errors, GetTransactionID(), &cancelID); status = OPCAutomation_DIOPCGroupEventRegOnAsyncReadComplete(OPCServerHandle, ProcessGroupAsyncReadComplete, NULL, 1, &AsyncReadCompleteID); // SafeArrayDestroy(serverHandles); // SafeArrayDestroy(errors); }
0 Kudos
Message 12 of 17
(1,480 Views)
Perry, I just come back from a business trip. I tried the ActiveX Array functions and it still won't work. My code is as follows. Any idea what's the problem? Thanks, Margaret int AsyncReadCompleteID=0; void GroupAsyncRead(void) { char *v_item; long *v_handle; OPCAutomationObj_OPCItems ppItems; OPCAutomationObj_OPCItem ppItem; long numItems, hvalue, i; SAFEARRAY *serverHandles, *errors; status = OPCAutomation_IOPCGroupGetOPCItems(OPCGroupHandle, &Error_Info, &ppItems); status = OPCAutomation_OPCItemsGetCount(ppItems, &Error_Info, &numItems); v_handle = (long *)malloc(sizeof(long)*numItems); for(i=0; i < numItems; i++) { status = OPCAutomation_OPCItemsItem(ppItems, &Error_Info, CA_VariantInt(i+1), &ppItem); // status = OPCAutomation_OPCItemGetItemID(ppItem, &Error_Info, &v_item); //verify status = OPCAutomation_OPCItemGetServerHandle(ppItem, &Error_Info, &hvalue); v_handle[i] = hvalue; } status = CA_Array1DToSafeArray(v_handle, CAVT_LONG, numItems, &serverHandles); //AsyncRead returns a negative value to status. status = OPCAutomation_IOPCGroupAsyncRead(OPCGroupHandle, &Error_Info, numItems, &serverHandles, &errors, GetTransactionID(), &cancelID); asyncReadInProgress = 1; status = OPCAutomation_DIOPCGroupEventRegOnAsyncReadComplete(OPCServerHandle, ProcessGroupAsyncReadComplete, NULL, 1, &AsyncReadCompleteID); // SafeArrayDestroy(serverHandles); // SafeArrayDestroy(errors); }
0 Kudos
Message 13 of 17
(1,479 Views)
The code was messed up. int AsyncReadCompleteID=0; void GroupAsyncRead(void) { char *v_item; long *v_handle; OPCAutomationObj_OPCItems ppItems; OPCAutomationObj_OPCItem ppItem; long numItems, hvalue, i; SAFEARRAY *serverHandles, *errors; status = OPCAutomation_IOPCGroupGetOPCItems(OPCGroupHandle, &Error_Info, &ppItems); status = OPCAutomation_OPCItemsGetCount(ppItems, &Error_Info, &numItems); v_handle = (long *)malloc(sizeof(long)*numItems); for(i=0; i < numItems; i++) { status = OPCAutomation_OPCItemsItem(ppItems, &Error_Info, CA_VariantInt(i+1), &ppItem); // status = OPCAutomation_OPCItemGetItemID(ppItem, &Error_Info, &v_item); //verify status = OPCAutomation_OPCItemGetServerHandle(ppItem, &Error_Info, &hvalue); v_handle[i] = hvalue; } status = CA_Array1DToSafeArray(v_handle, CAVT_LONG, numItems, &serverHandles); //AsyncRead returns a negative value to status. status = OPCAutomation_IOPCGroupAsyncRead(OPCGroupHandle, &Error_Info, numItems, &serverHandles, &errors, GetTransactionID(), &cancelID); status = OPCAutomation_DIOPCGroupEventRegOnAsyncReadComplete(OPCServerHandle, ProcessGroupAsyncReadComplete, NULL, 1, &AsyncReadCompleteID); // SafeArrayDestroy(serverHandles); // SafeArrayDestroy(errors); }
0 Kudos
Message 14 of 17
(1,476 Views)

Hi Marg SZ,

 

Could you upload a Screen shot of your code? That would be alot clearer or me. Please help me understand what you meant by "it did not work"? Did you get an error? Please let me know.

 

Thanks.

 

Perry S.

Applications Engineer
National Instruments
0 Kudos
Message 15 of 17
(1,471 Views)

Perry,

 

Please see the attached code.

Thanks,

 

Margaret

0 Kudos
Message 16 of 17
(1,461 Views)

Hi Marg SZ,

 

Here is an online help file that describe how safearrays are used in CVI.

 

http://zone.ni.com/reference/en-XX/help/370051H-01/cvi/cvivariants_and_safe_arrays/

 

Here is the help file on how to create safe arrays in CVI.

 

http://zone.ni.com/reference/en-XX/help/370051T-01/cvi/libref/cvica_array1dtosafearray/

 

Please follow these to create your safearray. Have a great day.

 

Perry S.

Applications Engineer
National Instruments
0 Kudos
Message 17 of 17
(1,452 Views)