inte glömt, men det var det där med tid......
Fick några timmar över ikväll, gjorde lite framsteg,
ska göra om det på en "ny fräsch" rpi3 när jag får lite mer tid och dokumentera owfs delen.
Denna hallonpaj har loggat temperatur länge och hade redan OWFS installerat.
Började med att installera libmodbus
Kod: Markera allt
sudo apt-get update
sudo apt-get install libmodbus5 libmodbus-dev
Laddade ner exempel koden random-test-server.c
https://github.com/stephane/libmodbus/b ... t-server.c
Lagt till tre avsnitt, markerat med //**************//
Kod: Markera allt
/*
* Copyright © 2008-2014 Stéphane Raimbault <stephane.raimbault@gmail.com>
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <stdio.h>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <stdlib.h>
#include <errno.h>
#include <modbus.h>
int main(void)
{
//************************************************************************//
FILE *fd;
fd =fopen("/mnt/1wire/10.D98592010800/temperature","r");
char text[20];
//************************************************************************//
int s = -1;
modbus_t *ctx;
modbus_mapping_t *mb_mapping;
ctx = modbus_new_tcp("127.0.0.1", 1502);
/* modbus_set_debug(ctx, TRUE); */
mb_mapping = modbus_mapping_new(500, 500, 500, 500);
if (mb_mapping == NULL) {
fprintf(stderr, "Failed to allocate the mapping: %s\n",
modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
s = modbus_tcp_listen(ctx, 1);
modbus_tcp_accept(ctx, &s);
for (;;) {
uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
int rc;
//************************************************************************//
fscanf(fd,"%[^\n]", text);
mb_mapping->tab_input_registers[0] = (int)(strtof(text, NULL)*100);
//***********************************************************************//
rc = modbus_receive(ctx, query);
if (rc > 0) {
/* rc is the query size */
modbus_reply(ctx, query, rc, mb_mapping);
} else if (rc == -1) {
/* Connection closed by the client or error */
break;
}
}
printf("Quit the loop: %s\n", modbus_strerror(errno));
if (s != -1) {
close(s);
}
modbus_mapping_free(mb_mapping);
modbus_close(ctx);
modbus_free(ctx);
//************************************************************************//
fclose(fd);
//************************************************************************//
return 0;
}
Först avsnittet öppnar temperaturfilen och deklarera en slaskvariabel att läsa från filen till.
Andra avsnittet läser filen som en sträng, omvandla till en float multlicera med 100 och omvandla till en integer,
det resultatet läggs till det första input registret (mb_mapping->tab_input_registers[0]).
Sista avsnittet stänger filen.
Döpte min ändrade fil till test-server.c
Kompilerade sedan koden med
Kod: Markera allt
gcc -I /usr/include/modbus test-server.c -o test-server -L/usr/lib/modbus -lmodbus
och körde med
Kollade med modscan:
modscan.JPG
Valde controller enligt din instruktion, la till en tag, där jag skalade tillbaka den tidigare multiplikationen, inte hunnit kolla om det verkligen funkar
(eller om jag trunkat decimalerna)
tag.JPG
tryckte på play
temperatu.JPG
Det var framgång !
skalstrecken blir lite mongo, men då har jag något att träna på
Som server programmet är skrivet avslutas det när klienten kopplar ner,
så man får starta om det mellan varje test.
Det finns ingen felhantering alls i det jag la till och om det är lämpligt att multiplicera med 100 för att slippa flyttal,
beror ju helt på vad man har för värden.