Reading and writing of TIME/DATE variables

Download: Reading and writing of TIME/DATE variables

The PLC contains the TIME variable MAIN.Time1 and the DT variable MAIN.Date1. This example shows how to read, write and display those variables:

#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <time.h>

// ADS headers for TwinCAT 3
#include "C:\TwinCAT\3.0\AdsApi\TcAdsDll\Include\TcAdsDef.h"
#include "C:\TwinCAT\3.0\AdsApi\TcAdsDll\Include\TcAdsAPI.h"

#define TIME_LENGHT 56
#define DATE_LENGHT 62
#define MON_START 1
#define YEAR_START 1900

int _tmain(int argc, _TCHAR* argv[])
{
long lErr, lPort;
long lTime, lMs, lSek, lMin, lHour, lDay;
AmsAddr Addr;
PAmsAddr pAddr = &Addr;
DWORD dwTime, dwDate;
ULONG lHdlTime, lHdlDate;

// Declare PLC variable
char szPlcTime []={"MAIN.Time1"};
char szPlcDate []={"MAIN.Date1"};

// Open the communication
lPort = AdsPortOpen();
lErr = AdsGetLocalAddress(pAddr);
if(lErr) printf_s((char*)"Error: Getting local adress: 0x%i \n", lErr);
pAddr->port = AMSPORT_R0_PLC_RTS1;

// Get variable handle
lErr = AdsSyncReadWriteReq(pAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(lHdlTime), &lHdlTime, sizeof(szPlcTime), szPlcTime);
lErr = AdsSyncReadWriteReq(pAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(lHdlDate), &lHdlDate, sizeof(szPlcDate), szPlcDate);

// Read from MAIN.Time1
lErr = AdsSyncReadReq(pAddr,
ADSIGRP_SYM_VALBYHND, // IndexGroup
lHdlTime, // IndexOffset
0x4, // Size of DWORD
&dwTime);
if(lErr) printf_s((char*)"Error: Read time variable: 0x%i \n", lErr);

//Convert DWORD to Time
lTime = (long)dwTime;
lMs = (lTime % 1000);
lSek = (lTime / 1000) % 60;
lMin = (lTime / 60000) % 60;
lHour = (lTime / 3600000) % 24;
lDay = (lTime / 86400000) % 365;

wchar_t szTime[TIME_LENGHT];
wsprintf(szTime, L"Time from PLC: %dd %dh %dm %ds %dms \n",
lDay,
lHour,
lMin,
lSek,
lMs);
wprintf_s(szTime);

//Write to MAIN.Time1
//Manipulate DWORD for demonstration
dwTime += 3600000; //Add 3600000ms (One hour)

//AdsWrite
lErr = AdsSyncWriteReq(pAddr,
ADSIGRP_SYM_VALBYHND, //IndexGroup
lHdlTime, //IndexOffset
0x4,
&dwTime);
if(lErr) printf_s((char*)"Error: Write time variable: 0x%i \n", lErr);

//Read from MAIN.Date1
//AdsRead
lErr = AdsSyncReadReq(pAddr,
ADSIGRP_SYM_VALBYHND, //IndexGroup
lHdlDate, //IndexOffset
0x4,
&dwDate);
if(lErr) printf_s((char*)"Error: Read date variable: 0x%i \n", lErr);

//Convert long to date
time_t tDate(dwDate);
tm tmDate;

gmtime_s(&tmDate, &tDate);

wchar_t szDate[DATE_LENGHT];
wsprintf(szDate, L"Date from PLC: %d/%d/%d %d:%d:%d \n",
tmDate.tm_mday,
tmDate.tm_mon + MON_START,
tmDate.tm_year + YEAR_START,
tmDate.tm_hour,
tmDate.tm_min,
tmDate.tm_sec);
wprintf_s(szDate);

//Write to MAIN.Date1
//Manipulate DWORD for demonstration
dwDate += 3600; //Add 3600s (One hour)

//AdsWrite
lErr = AdsSyncWriteReq(pAddr,
ADSIGRP_SYM_VALBYHND, //IndexGroup
lHdlDate, //IndexOffset
0x4,
&dwDate);
if(lErr) printf_s((char*)L"Error: Write time variable: 0x%i \n", lErr);

//Releases handles of plc variable
lErr = AdsSyncWriteReq(pAddr, ADSIGRP_SYM_RELEASEHND, 0, sizeof(lHdlTime), &lHdlTime);
if (lErr) printf("Error: AdsSyncWriteReq: %d \n", lErr);
lErr = AdsSyncWriteReq(pAddr, ADSIGRP_SYM_RELEASEHND, 0, sizeof(lHdlDate), &lHdlDate);
if (lErr) printf("Error: AdsSyncWriteReq: %d \n", lErr);

//Close the communication
lErr = AdsPortClose();
if(lErr) printf_s((char*)L"Error: Closing connection: 0x%i \n", lErr);

printf_s("\nPress enter to exit..");
getchar();
}