Skip to content

Commit 7ed2fd8

Browse files
author
ricardolo
committed
Merge branch 'master' of https://github.com/riclolsen/OSHMI
2 parents a034f89 + 6baf8e0 commit 7ed2fd8

File tree

4 files changed

+147
-92
lines changed

4 files changed

+147
-92
lines changed

DNP3/MySOEHandler.cpp

Lines changed: 93 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Bin
129129
int max_pointspkt = PKTDIG_MAXPOINTS;
130130

131131
PrintHeaderInfo(info);
132-
NoDataCntTime = 0; // mantém link vivo
132+
NoDataCntTime = 0; // mantém link vivo
133133

134134
// monta buffer de mensagem para OSHMI no formato I104M
135135
t_msgsupsq msg;
@@ -161,7 +161,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Bin
161161
pair.value.time << " RTU:" << msg.sec << std::endl;
162162

163163
count++;
164-
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
164+
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
165165
{
166166
msg.numpoints = count % max_pointspkt;
167167
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(digital_notime_seq));
@@ -208,7 +208,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Bin
208208
pair.value.time << " RTU:" << msg.sec << std::endl;
209209

210210
count++;
211-
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
211+
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
212212
{
213213
msg.numpoints = count % max_pointspkt;
214214
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(digital_w_time7_seq));
@@ -229,7 +229,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Dou
229229
int max_pointspkt = PKTDIG_MAXPOINTS;
230230

231231
PrintHeaderInfo(info);
232-
NoDataCntTime = 0; // mantém link vivo
232+
NoDataCntTime = 0; // mantém link vivo
233233

234234
// monta buffer de mensagem para OSHMI no formato I104M
235235
t_msgsupsq msg;
@@ -261,7 +261,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Dou
261261
pair.value.time << " RTU:" << msg.sec << std::endl;
262262

263263
count++;
264-
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
264+
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
265265
{
266266
msg.numpoints = count % max_pointspkt;
267267
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(digital_notime_seq));
@@ -308,7 +308,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Dou
308308
pair.value.time << " RTU:" << msg.sec << std::endl;
309309

310310
count++;
311-
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
311+
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
312312
{
313313
msg.numpoints = count % max_pointspkt;
314314
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(digital_w_time7_seq));
@@ -329,7 +329,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Ana
329329
int packet_size;
330330

331331
PrintHeaderInfo(info);
332-
NoDataCntTime = 0; // mantém link vivo
332+
NoDataCntTime = 0; // mantém link vivo
333333

334334
// monta buffer de mensagem para OSHMI no formato I104M
335335
t_msgsupsq msg;
@@ -340,46 +340,93 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Ana
340340

341341
int count = 0;
342342

343-
msg.tipo = 13;
344-
msg.taminfo = sizeof(flutuante_seq); // value size for the type (not counting the 4 byte address)
345-
values.ForeachItem([&](const Indexed<Analog>& pair)
346-
{
347-
// acerta endereco do ponto
348-
unsigned int * paddr = (unsigned int *)(msg.info + (count % PKTANA_MAXPOINTS) * (sizeof(int) + sizeof(flutuante_seq)));
349-
*paddr = pair.index + OFFSET_ANALOG; // considera offset para o grupo
350-
351-
// valor e qualidade
352-
flutuante_seq * obj = (flutuante_seq *)(paddr + 1);
353-
obj->fr = (float)pair.value.value;
354-
obj->qds = xlatequalif(pair.value.flags.value);
355-
356-
std::cout << "[" << pair.index << "] : " <<
357-
pair.value.value << " : " <<
358-
static_cast<int>(pair.value.flags.value) << " : " <<
359-
pair.value.time << " RTU:" << msg.sec << std::endl;
360-
361-
count++;
343+
if (info.gv != GroupVariation::Group32Var3 && info.gv != GroupVariation::Group32Var4
344+
&& info.gv != GroupVariation::Group32Var7 && info.gv != GroupVariation::Group32Var8)
345+
{ // without time
346+
msg.tipo = 13; // float without time
347+
msg.taminfo = sizeof(flutuante_seq); // value size for the type (not counting the 4 byte address)
348+
values.ForeachItem([&](const Indexed<Analog>& pair) {
349+
// acerta endereco do ponto
350+
unsigned int* paddr
351+
= (unsigned int*)(msg.info + (count % PKTANA_MAXPOINTS) * (sizeof(int) + sizeof(flutuante_seq)));
352+
*paddr = pair.index + OFFSET_ANALOG; // considera offset para o grupo
353+
354+
// valor e qualidade
355+
flutuante_seq* obj = (flutuante_seq*)(paddr + 1);
356+
obj->fr = (float)pair.value.value;
357+
obj->qds = xlatequalif(pair.value.flags.value);
358+
359+
std::cout << "[" << pair.index << "] : " << pair.value.value << " : "
360+
<< static_cast<int>(pair.value.flags.value) << " RTU:" << msg.sec
361+
<< std::endl;
362+
363+
count++;
364+
365+
if (!((count + 1) % PKTANA_MAXPOINTS)) // se a próxima é do próximo pacote, manda agora
366+
{
367+
msg.numpoints = count % PKTANA_MAXPOINTS;
368+
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(flutuante_seq));
369+
SendOSHMI(&msg, packet_size);
370+
}
371+
});
362372

363-
if ( !((count + 1) % PKTANA_MAXPOINTS)) // se a próxima é do próximo pacote, manda agora
364-
{
365-
msg.numpoints = count % PKTANA_MAXPOINTS;
366-
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(flutuante_seq));
367-
SendOSHMI(&msg, packet_size);
368-
}
373+
msg.numpoints = count % PKTANA_MAXPOINTS;
374+
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(flutuante_seq));
375+
SendOSHMI(&msg, packet_size);
376+
}
377+
else
378+
{ // with time
379+
msg.tipo = 36; // float with time
380+
msg.taminfo = sizeof(flutuante_w_time7_seq); // value size for the type (not counting the 4 byte address)
381+
values.ForeachItem([&](const Indexed<Analog>& pair) {
382+
// acerta endereco do ponto
383+
unsigned int* paddr
384+
= (unsigned int*)(msg.info
385+
+ (count % PKTANA_MAXPOINTS) * (sizeof(int) + sizeof(flutuante_w_time7_seq)));
386+
*paddr = pair.index + OFFSET_ANALOG; // considera offset para o grupo
387+
388+
// valor e qualidade
389+
flutuante_w_time7_seq* obj = (flutuante_w_time7_seq*)(paddr + 1);
390+
obj->fr = (float)pair.value.value;
391+
obj->qds = xlatequalif(pair.value.flags.value);
392+
393+
time_t tmi = pair.value.time / 1000;
394+
struct tm* unxtm = localtime(&tmi);
395+
396+
obj->ano = unxtm->tm_year % 100;
397+
obj->mes = unxtm->tm_mon + 1;
398+
obj->dia = unxtm->tm_mday;
399+
obj->hora = unxtm->tm_hour;
400+
obj->min = unxtm->tm_min;
401+
obj->ms = (unsigned short)(unxtm->tm_sec * 1000 + pair.value.time % 1000);
402+
403+
std::cout << "[" << pair.index << "] : " << pair.value.value << " : "
404+
<< static_cast<int>(pair.value.flags.value) << " : " << pair.value.time << msg.sec << " RTU:" << msg.sec
405+
<< std::endl;
406+
407+
count++;
408+
409+
if (!((count + 1) % PKTANA_MAXPOINTS)) // se a próxima é do próximo pacote, manda agora
410+
{
411+
msg.numpoints = count % PKTANA_MAXPOINTS;
412+
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(flutuante_w_time7_seq));
413+
SendOSHMI(&msg, packet_size);
414+
}
415+
});
369416

370-
});
417+
msg.numpoints = count % PKTANA_MAXPOINTS;
418+
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(flutuante_w_time7_seq));
419+
SendOSHMI(&msg, packet_size);
420+
}
371421

372-
msg.numpoints = count % PKTANA_MAXPOINTS;
373-
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(flutuante_seq));
374-
SendOSHMI(&msg, packet_size);
375422
}
376423

377424
void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Counter>>& values)
378425
{
379426
int packet_size;
380427

381428
PrintHeaderInfo(info);
382-
NoDataCntTime = 0; // mantém link vivo
429+
NoDataCntTime = 0; // mantém link vivo
383430

384431
// monta buffer de mensagem para OSHMI no formato I104M
385432
t_msgsupsq msg;
@@ -410,7 +457,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Cou
410457

411458
count++;
412459

413-
if (!((count + 1) % PKTANA_MAXPOINTS)) // se a próxima é do próximo pacote, manda agora
460+
if (!((count + 1) % PKTANA_MAXPOINTS)) // se a próxima é do próximo pacote, manda agora
414461
{
415462
msg.numpoints = count % PKTANA_MAXPOINTS;
416463
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(integrated_seq));
@@ -429,7 +476,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Fro
429476
int packet_size;
430477

431478
PrintHeaderInfo(info);
432-
NoDataCntTime = 0; // mantém link vivo
479+
NoDataCntTime = 0; // mantém link vivo
433480

434481
// monta buffer de mensagem para OSHMI no formato I104M
435482
t_msgsupsq msg;
@@ -460,7 +507,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Fro
460507

461508
count++;
462509

463-
if (!((count + 1) % PKTANA_MAXPOINTS)) // se a próxima é do próximo pacote, manda agora
510+
if (!((count + 1) % PKTANA_MAXPOINTS)) // se a próxima é do próximo pacote, manda agora
464511
{
465512
msg.numpoints = count % PKTANA_MAXPOINTS;
466513
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(flutuante_seq));
@@ -480,7 +527,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Bin
480527
int max_pointspkt = PKTDIG_MAXPOINTS;
481528

482529
PrintHeaderInfo(info);
483-
NoDataCntTime = 0; // mantém link vivo
530+
NoDataCntTime = 0; // mantém link vivo
484531

485532
// monta buffer de mensagem para OSHMI no formato I104M
486533
t_msgsupsq msg;
@@ -512,7 +559,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Bin
512559
pair.value.time << " RTU:" << msg.sec << std::endl;
513560

514561
count++;
515-
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
562+
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
516563
{
517564
msg.numpoints = count % max_pointspkt;
518565
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(digital_notime_seq));
@@ -559,7 +606,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Bin
559606
pair.value.time << " RTU:" << msg.sec << std::endl;
560607

561608
count++;
562-
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
609+
if (!((count + 1) % max_pointspkt)) // se a próxima é do próximo pacote, manda agora
563610
{
564611
msg.numpoints = count % max_pointspkt;
565612
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(digital_w_time7_seq));
@@ -579,7 +626,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Ana
579626
int packet_size;
580627

581628
PrintHeaderInfo(info);
582-
NoDataCntTime = 0; // mantém link vivo
629+
NoDataCntTime = 0; // mantém link vivo
583630

584631
// monta buffer de mensagem para OSHMI no formato I104M
585632
t_msgsupsq msg;
@@ -610,7 +657,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Ana
610657

611658
count++;
612659

613-
if (!((count + 1) % PKTANA_MAXPOINTS)) // se a próxima é do próximo pacote, manda agora
660+
if (!((count + 1) % PKTANA_MAXPOINTS)) // se a próxima é do próximo pacote, manda agora
614661
{
615662
msg.numpoints = count % PKTANA_MAXPOINTS;
616663
packet_size = sizeof(int) * 7 + msg.numpoints * (sizeof(int) + sizeof(flutuante_seq));
@@ -627,7 +674,7 @@ void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<Ana
627674
void MySOEHandler::Process(const HeaderInfo& info, const ICollection<Indexed<OctetString>>& values)
628675
{
629676
this->PrintHeaderInfo(info);
630-
NoDataCntTime = 0; // mantém link vivo
677+
NoDataCntTime = 0; // mantém link vivo
631678

632679
values.ForeachItem([&](const Indexed<OctetString>& pair)
633680
{

DNP3/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
*
2323
*/
2424

25-
#define DRIVER_VERSION "OSHMI DNP3 DRIVER V0.76 (Based on Open DNP3 2.3.2) - Copyright 2016-2020 - Ricardo Lastra Olsen"
25+
#define DRIVER_VERSION "OSHMI DNP3 DRIVER V0.77 (Based on Open DNP3 2.3.2) - Copyright 2016-2020 - Ricardo Lastra Olsen"
2626

2727
#include <asiodnp3/DNP3Manager.h>
2828
#include <asiodnp3/PrintingSOEHandler.h>

DNP3/oshmi_types.h

Lines changed: 11 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,7 @@ typedef struct
5050
#pragma pack(1) // membros das estruturas alinhados em byte
5151

5252
typedef struct {
53-
unsigned short nponto; // numero do ponto
54-
unsigned char nponto3; // 3 byte do numero do ponto
55-
unsigned char iq; // informaçao com qualificador
56-
unsigned short ms; // milisegundos
57-
unsigned char min; // minuto
58-
unsigned char hora; // hora
59-
unsigned char dia; // dia
60-
unsigned char mes;
61-
unsigned char ano;
62-
} digital_w_time7;
63-
64-
typedef struct {
65-
unsigned char iq; // informaçao com qualificador
53+
unsigned char iq; // informaçao com qualificador
6654
unsigned short ms; // milisegundos
6755
unsigned char min; // minuto
6856
unsigned char hora; // hora
@@ -73,51 +61,35 @@ typedef struct {
7361

7462

7563
typedef struct {
76-
unsigned char iq; // informaçao com qualificador
64+
unsigned char iq; // informaçao com qualificador
7765
} digital_notime_seq;
7866

79-
typedef struct {
80-
unsigned short nponto; // numero do ponto
81-
unsigned char nponto3; // 3 byte do numero do ponto
82-
short sva; // valor analogico
83-
unsigned char qds; // qualificador do ponto
84-
} analogico;
8567

8668
typedef struct {
8769
short sva; // valor analogico
8870
unsigned char qds; // qualificador do ponto
8971
} analogico_seq;
9072

91-
typedef struct {
92-
unsigned short nponto; // numero do ponto
93-
unsigned char nponto3; // 3 byte do numero do ponto
94-
unsigned char vti; // valor de tap
95-
unsigned char qds; // qualificador
96-
} step;
97-
9873
typedef struct {
9974
unsigned char vti; // valor de tap
10075
unsigned char qds; // qualificador
10176
} step_seq;
10277

103-
typedef struct {
104-
unsigned short nponto; // numero do ponto
105-
unsigned char nponto3; // 3 byte do numero do ponto
106-
float fr; // valor em ponto flutuante
107-
unsigned char qds; // qualificador do ponto
108-
} flutuante;
109-
11078
typedef struct {
11179
float fr; // valor em ponto flutuante
11280
unsigned char qds; // qualificador do ponto
11381
} flutuante_seq;
11482

11583
typedef struct {
116-
unsigned short nponto; // numero do ponto
117-
unsigned char nponto3; // 3 byte do numero do ponto
118-
unsigned int bcr; // valor binary counter reading
119-
unsigned char qds; // qualificador do ponto
120-
} integrated;
84+
float fr; // valor em ponto flutuante
85+
unsigned char qds; // qualificador do ponto
86+
unsigned short ms; // milisegundos
87+
unsigned char min; // minuto
88+
unsigned char hora; // hora
89+
unsigned char dia; // dia
90+
unsigned char mes;
91+
unsigned char ano;
92+
} flutuante_w_time7_seq;
12193

12294
typedef struct {
12395
unsigned int bcr; // valor binary counter reading

0 commit comments

Comments
 (0)