Is het mogelijk dit tegelijk te laten werken?
ik wil vanuit een plc via modbus de datum/tijd naar een arduino mega te sturen (dat werkt trouwens al)
Deze Datum/tijd wil ik via een Time Server naar andere hardware in me netwerk zenden...
maar gaat dat lukken?
ik heb op dit moment dit
#include <SPI.h>
#include <Ethernet.h>
#include "MgsModbus.h"
#include <EthernetUdp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
#include <UTFTGLUE.h> //use GLUE class and constructor
UTFTGLUE myGLCD(0, A2, A1, A3, A4, A0); //all dummy args
// Time Server Port
#define NTP_PORT 123
MgsModbus Mb;
// Ethernet settings (depending on MAC and Local network)
byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB5 };
IPAddress ip(192, 168, 3, 250);
IPAddress gateway(192, 168, 3, 100);
IPAddress subnet(255, 255, 255, 0);
static const int NTP_PACKET_SIZE = 48;
// buffers for receiving and sending data
byte packetBuffer[NTP_PACKET_SIZE];
// An Ethernet UDP instance
EthernetUDP Udp;
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long date, time, age;
uint32_t timestamp, tempval;
void setup()
{
// serial setup
Serial.begin(9600);
Serial.println("Serial interface started");
// initialize the ethernet device
Ethernet.begin(mac, ip, gateway, subnet); // start etehrnet interface
Serial.println("Ethernet interface started");
// print your local IP address:
Serial.print("My IP address: ");
for (byte thisByte = 0; thisByte < 4; thisByte++) {
// print the value of each byte of the IP address:
Serial.print(Ethernet.localIP()[thisByte], DEC);
Serial.print(".");
}
myGLCD.InitLCD();
// Clear the screen
myGLCD.clrScr();
//myGLCD.setFont(WideFont);
myGLCD.setColor(100, 255, 100);
myGLCD.setBackColor(0, 0, 0);
myGLCD.fillScr(0, 0, 0);
myGLCD.setTextSize(8);
}
void loop()
{
Mb.MbsRun();
myGLCD.printNumI( Mb.MbData[2], 0, 100);
myGLCD.printNumI( Mb.MbData[1], 110, 100);
myGLCD.printNumI( Mb.MbData[0], 220, 100);
myGLCD.printNumI( Mb.MbData[3], 0, 200);
myGLCD.printNumI( Mb.MbData[4], 110, 200);
myGLCD.printNumI( Mb.MbData[5], 220, 200);
Serial.print(Mb.MbData[2]);
Serial.print(":");
Serial.print(Mb.MbData[1]);
Serial.print(":");
Serial.print(Mb.MbData[0]);
Serial.print(" - ");
Serial.print(Mb.MbData[3]);
Serial.print("/");
Serial.print(Mb.MbData[4]);
Serial.print("/");
Serial.println(Mb.MbData[5]);
year = Mb.MbData[5];
month = Mb.MbData[4];
day = Mb.MbData[3];
hour = Mb.MbData[2];
minute = Mb.MbData[1];
second = Mb.MbData[0];
//processNTP();
}
void processNTP() {
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if (packetSize)
{
Udp.read(packetBuffer, NTP_PACKET_SIZE);
IPAddress Remote = Udp.remoteIP();
int PortNum = Udp.remotePort();
#if debug
Serial.println();
Serial.print("Received UDP packet size ");
Serial.println(packetSize);
Serial.print("From ");
for (int i = 0; i < 4; i++)
{
Serial.print(Remote[i], DEC);
if (i < 3)
{
Serial.print(".");
}
}
Serial.print(", port ");
Serial.print(PortNum);
byte LIVNMODE = packetBuffer[0];
Serial.print(" LI, Vers, Mode :");
Serial.print(packetBuffer[0], HEX);
byte STRATUM = packetBuffer[1];
Serial.print(" Stratum :");
Serial.print(packetBuffer[1], HEX);
byte POLLING = packetBuffer[2];
Serial.print(" Polling :");
Serial.print(packetBuffer[2], HEX);
byte PRECISION = packetBuffer[3];
Serial.print(" Precision :");
Serial.println(packetBuffer[3], HEX);
for (int z = 0; z < NTP_PACKET_SIZE; z++) {
Serial.print(packetBuffer[z], HEX);
if (((z + 1) % 4) == 0) {
Serial.println();
}
}
Serial.println();
#endif
packetBuffer[0] = 0b00100100; // LI, Version, Mode
packetBuffer[1] = 1 ; // stratum
packetBuffer[2] = 6 ; // polling minimum
packetBuffer[3] = 0xFA; // precision
packetBuffer[7] = 0; // root delay
packetBuffer[8] = 0;
packetBuffer[9] = 8;
packetBuffer[10] = 0;
packetBuffer[11] = 0; // root dispersion
packetBuffer[12] = 0;
packetBuffer[13] = 0xC;
packetBuffer[14] = 0;
timestamp = numberOfSecondsSince1900Epoch(year, month, day, hour, minute, second);
Serial.println(timestamp);
tempval = timestamp;
packetBuffer[12] = 71; //"G";
packetBuffer[13] = 80; //"P";
packetBuffer[14] = 83; //"S";
packetBuffer[15] = 0; //"0";
// reference timestamp
packetBuffer[16] = (tempval >> 24) & 0XFF;
tempval = timestamp;
packetBuffer[17] = (tempval >> 16) & 0xFF;
tempval = timestamp;
packetBuffer[18] = (tempval >> 8) & 0xFF;
tempval = timestamp;
packetBuffer[19] = (tempval) & 0xFF;
packetBuffer[20] = 0;
packetBuffer[21] = 0;
packetBuffer[22] = 0;
packetBuffer[23] = 0;
//copy originate timestamp from incoming UDP transmit timestamp
packetBuffer[24] = packetBuffer[40];
packetBuffer[25] = packetBuffer[41];
packetBuffer[26] = packetBuffer[42];
packetBuffer[27] = packetBuffer[43];
packetBuffer[28] = packetBuffer[44];
packetBuffer[29] = packetBuffer[45];
packetBuffer[30] = packetBuffer[46];
packetBuffer[31] = packetBuffer[47];
//receive timestamp
packetBuffer[32] = (tempval >> 24) & 0XFF;
tempval = timestamp;
packetBuffer[33] = (tempval >> 16) & 0xFF;
tempval = timestamp;
packetBuffer[34] = (tempval >> 8) & 0xFF;
tempval = timestamp;
packetBuffer[35] = (tempval) & 0xFF;
packetBuffer[36] = 0;
packetBuffer[37] = 0;
packetBuffer[38] = 0;
packetBuffer[39] = 0;
//transmitt timestamp
packetBuffer[40] = (tempval >> 24) & 0XFF;
tempval = timestamp;
packetBuffer[41] = (tempval >> 16) & 0xFF;
tempval = timestamp;
packetBuffer[42] = (tempval >> 8) & 0xFF;
tempval = timestamp;
packetBuffer[43] = (tempval) & 0xFF;
packetBuffer[44] = 0;
packetBuffer[45] = 0;
packetBuffer[46] = 0;
packetBuffer[47] = 0;
// Reply to the IP address and port that sent the NTP request
Udp.beginPacket(Remote, PortNum);
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
}
////////////////////////////////////////
const uint8_t daysInMonth [] PROGMEM = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
}; //const or compiler complains
const unsigned long seventyYears = 2208988800UL; // to convert unix time to epoch
// NTP since 1900/01/01
static unsigned long int numberOfSecondsSince1900Epoch(uint16_t y, uint8_t m, uint8_t d, uint8_t h, uint8_t mm, uint8_t s) {
if (y >= 1970)
y -= 1970;
uint16_t days = d;
for (uint8_t i = 1; i < m; ++i)
days += pgm_read_byte(daysInMonth + i - 1);
if (m > 2 && y % 4 == 0)
++days;
days += 365 * y + (y + 3) / 4 - 1;
return days * 24L * 3600L + h * 3600L + mm * 60L + s + seventyYears;
}