/* 7k87kdio.c: Demo program for 7K and 87K DIO module connected to COM port of uPAC-5000. Before running the demo, user must use DCON Utility to set Address, Baudrate and CheckSum. Compiler: BC++ 3.1, Turbo C++ 1.01 (3.01) MSVC 1.52 Compile mode: large Project: 7k87kdio.c ..\..\Lib\uPAC5000.lib Hardware: uPAC-5000 <== COM port ==> 7K or 87K module [Dec 30, 2011] by Liam */ #include #include "..\..\lib\upac5000.h" int Write7K87K_DIO_DO(int iComPort, int iAddress, int TotalChannel, int iCheckSum, int Timeout, int DOdata); int Read7K87K_DIO(int iComPort, int iAddress, int TotalChannel, int iCheckSum, int Timeout, unsigned int *DIdata, unsigned int *ReadbackDO); void main(void) { int DOdata,TotalDOChannel,iRet,iComPort,iAddress,iCheckSum,iTimeout; unsigned char cTemp[8]; unsigned int DIdata,ReadbackDO; unsigned long lBaudrate; InitLib(); /* InitLib() must be called before other functions in the library may be used */ Print("Please Input ComPort Number:"); LineInput(cTemp, 8); sscanf(cTemp, "%d", &iComPort); Print("Please Input ComPort's Baudrate:"); LineInput(cTemp, 8); sscanf(cTemp, "%ld", &lBaudrate); Print("Please Select Checksum(0:Disable or 1:Enable):"); LineInput(cTemp, 8); sscanf(cTemp, "%d", &iCheckSum); Print("Please Input module's address(0~255):"); LineInput(cTemp, 8); sscanf(cTemp, "%d", &iAddress); Print("Please Input Total DO Channel Number:"); LineInput(cTemp, 8); sscanf(cTemp, "%d", &TotalDOChannel); Print("Please Input Timeout:"); LineInput(cTemp, 8); sscanf(cTemp, "%d", &iTimeout); InstallCom(iComPort, lBaudrate, 8, 0, 1); // Begin to write DO and read DI for(;;) { Print("Please Input DO Data(Hex) = "); LineInput(cTemp, 8); sscanf(cTemp, "%X", &DOdata); iRet=Write7K87K_DIO_DO(iComPort, iAddress, TotalDOChannel, iCheckSum, iTimeout, DOdata); if(iRet==NoError) { Print("DO output OK!\r\n"); } else { Print("Writing DO receive response error. Error Code = %d\r\n", iRet); } Delay(10); //Wait for DO status is changed. //If you don't need to confirm the DO is changed correctly, remove the following codes. iRet=Read7K87K_DIO(iComPort, iAddress, TotalDOChannel, iCheckSum, iTimeout, &DIdata, &ReadbackDO); if(iRet==NoError) { Print("DO data= %X\r\n", ReadbackDO); Print("DI data= %X\r\n", DIdata); } else { Print("Reading DIO receive response error. Error Code = %d\r\n", iRet); } } } //===================================================================== //==== Following functions are for 7K,87K DIO modules. == //==== You can copy the functions to your own program. == //===================================================================== int Write7K87K_DIO_DO(int iComPort, int iAddress, int TotalDOChannel, int iCheckSum, int iTimeout, int iDOdata) { /* DCON protocol to write DO value Send command: @AA(Data) Valid Response: > iComPort: 1~8 iAddress: 0 ~ 255 iCheckSum: 0=Disable or 1=Enable iTimeout: unit=ms iTotalDOChannel: 1~16 iDOdata: output data */ int iRet, i, x; unsigned char OutBufCom[20], InBufCom[20]; unsigned int iMask=0; //Creat DO mask. For example: if DO channel= 5, the mask is 00011111. for(i=0; i') // a valid response is reveived { return NoError; } return -1; // an invalid response is reveived } return iRet; } int Read7K87K_DIO(int iComPort, int iAddress, int TotalDOChannel, int iCheckSum, int iTimeout, unsigned int *DIdata, unsigned int *ReadbackDO) { /* DCON protocol to read DI value Send command: @AA Valid Response: >(DO Data)(DI Data) ComPort: 1~8 Address: 0 ~ 255 CheckSum: 0=Disable or 1=Enable iTimeout: unit=ms TotalDOChannel: 1~16 *DIdata: pointer to record DI data *ReadbackDO: pointer to record DO readback data */ int iRet; unsigned char InBufCom[20], OutBufCom[20]; unsigned long DIO_value; sprintf(OutBufCom, "@%02X", iAddress); SendCmdTo7000(iComPort, OutBufCom, iCheckSum); iRet=ReceiveResponseFrom7000_ms(iComPort, InBufCom, iTimeout, iCheckSum); if(iRet==NoError) { if(InBufCom[0]=='>') // a valid response is reveived { if(TotalDOChannel<=4) { sscanf(InBufCom+1,"%04X",&DIO_value); *DIdata = DIO_value & 0x0F; *ReadbackDO = (DIO_value >> 8) & 0x0F; } else if(TotalDOChannel > 4 && TotalDOChannel<= 8 ) { sscanf(InBufCom+1,"%04X",&DIO_value); *DIdata = DIO_value & 0xFF; *ReadbackDO = (DIO_value >> 8) & 0xFF; } else { sscanf(InBufCom+1,"%08lX",&DIO_value); *DIdata = DIO_value & 0xFFFF; *ReadbackDO = (DIO_value >> 16) & 0xFFFF; } return NoError; } return -1; // an invalid response is reveived } return iRet; }