# directly query a PLC in Modbus TCP with Open Historian

**URL:** <http://discussions.gridprotectionalliance.org/t/directly-query-a-plc-in-modbus-tcp-with-open-historian/1404>\
**Category:** openHistorian\
**Created:** [April 28, 2025, 12:56pm UTC](http://discussions.gridprotectionalliance.org/t/directly-query-a-plc-in-modbus-tcp-with-open-historian/1404 "2025-04-28T12:56:55Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Philippe](http://discussions.gridprotectionalliance.org/user_avatar/discussions.gridprotectionalliance.org/philippe/32/1561_2.png) [@Philippe](http://discussions.gridprotectionalliance.org/u/Philippe)\
**Post date:** [April 28, 2025, 12:56pm UTC](http://discussions.gridprotectionalliance.org/t/directly-query-a-plc-in-modbus-tcp-with-open-historian/1404/1 "2025-04-28T12:56:55Z")

</div>

Hello, I would like to know if it’s possible to directly query a Modbus TCP PLC (read holding register code 03) with OpenHistorian.  
Installation on Windows Server 2022  
Thank you for your help  
Sincerely,

---

<div class="post-metadata">

**Author:** ![Philippe](http://discussions.gridprotectionalliance.org/user_avatar/discussions.gridprotectionalliance.org/philippe/32/1561_2.png) [@Philippe](http://discussions.gridprotectionalliance.org/u/Philippe)\
**Post date:** [May 8, 2025, 7:45pm UTC](http://discussions.gridprotectionalliance.org/t/directly-query-a-plc-in-modbus-tcp-with-open-historian/1404/2 "2025-05-08T19:45:33Z")

</div>

Hello,  
After much struggle, the PLC data acquisition is working.  
I would like to thank you for your nonexistent help.

I still notice a problem with negative INT values.  
Here is a screenshot of the animation table from my PLC and OpenHistorian.

 ![image](http://discussions.gridprotectionalliance.org/uploads/default/original/2X/e/e0657d53bef5b7c9076a42f19755783f797302b1.png)  
An error occurred: Sorry, new users can only put one embedded media item in a post.

I also noticed a problem with the scale in the web server:  
For example, for a voltage of 230.54V in OpenHistorian, the web server displays 2.3054V.

---

<div class="post-metadata">

**Author:** ![ritchiecarroll](http://discussions.gridprotectionalliance.org/user_avatar/discussions.gridprotectionalliance.org/ritchiecarroll/32/2_2.png) [@ritchiecarroll](http://discussions.gridprotectionalliance.org/u/ritchiecarroll)\
**Post date:** [May 8, 2025, 10:38pm UTC](http://discussions.gridprotectionalliance.org/t/directly-query-a-plc-in-modbus-tcp-with-open-historian/1404/3 "2025-05-08T22:38:27Z")

</div>

My apologies that no one responded to you sooner, we answer as best we can as we have time. In most cases, people can only respond to things they understand, so your question may have not been known to the community of people who respond to these questions.

You can use the openHistorian manager (UI app, not web) and navigate to Metadata \> Measurements to find the measurement needing scaling, then apply a multipler.

Thanks,  
Ritchie

---

<div class="post-metadata">

**Author:** ![Philippe](http://discussions.gridprotectionalliance.org/user_avatar/discussions.gridprotectionalliance.org/philippe/32/1561_2.png) [@Philippe](http://discussions.gridprotectionalliance.org/u/Philippe)\
**Post date:** [May 9, 2025, 1:40pm UTC](http://discussions.gridprotectionalliance.org/t/directly-query-a-plc-in-modbus-tcp-with-open-historian/1404/4 "2025-05-09T13:40:16Z")

</div>

Hello,  
Thank you for your reply.  
I added the value: Adder=-65536, but the problem arises when the value becomes positive again.  
Is it possible to do:  
IF data\<0  
THEN Adder:=-65536  
ELSE  
Adder:=0  
END\_IF  
or another value depending on the use?

Monitoring/Graph Measurements: Doesn’t it display negative values? Is this a known issue?  
I’ll have to investigate in Grafana for the users because openHistorian Web Manager doesn’t retrieve the correct values.  
At the moment, I can’t read the data in Grafana.I have the tags but not the values (I’m looking for it…)  
Thank you for your help.  
Sincerely,  
Philippe

---

<div class="post-metadata">

**Author:** ![StephenCWills](http://discussions.gridprotectionalliance.org/user_avatar/discussions.gridprotectionalliance.org/stephencwills/32/20_2.png) [@StephenCWills](http://discussions.gridprotectionalliance.org/u/StephenCWills)\
**Post date:** [May 9, 2025, 1:55pm UTC](http://discussions.gridprotectionalliance.org/t/directly-query-a-plc-in-modbus-tcp-with-open-historian/1404/5 "2025-05-09T13:55:05Z")

</div>

You can’t do a conditional adder. You’d have to create a custom filter adapter. Or you can fix `ModbusPoller`, which doesn’t appear to support `Int16`.

> <https://github.com/GridProtectionAlliance/gsf/blob/912389e96d98840d2a999d490420db618dcbe4c6/Source/Libraries/Adapters/ModbusAdapters/ModbusPoller.cs#L66-L76>

---

<div class="post-metadata">

**Author:** ![Philippe](http://discussions.gridprotectionalliance.org/user_avatar/discussions.gridprotectionalliance.org/philippe/32/1561_2.png) [@Philippe](http://discussions.gridprotectionalliance.org/u/Philippe)\
**Post date:** [May 9, 2025, 2:09pm UTC](http://discussions.gridprotectionalliance.org/t/directly-query-a-plc-in-modbus-tcp-with-open-historian/1404/6 "2025-05-09T14:09:19Z")

</div>

I can convert an INT16 to a UINT16 in my PLC… I’m testing it

---

<div class="post-metadata">

**Author:** ![Philippe](http://discussions.gridprotectionalliance.org/user_avatar/discussions.gridprotectionalliance.org/philippe/32/1561_2.png) [@Philippe](http://discussions.gridprotectionalliance.org/u/Philippe)\
**Post date:** [May 9, 2025, 3:51pm UTC](http://discussions.gridprotectionalliance.org/t/directly-query-a-plc-in-modbus-tcp-with-open-historian/1404/7 "2025-05-09T15:51:05Z")

</div>

Can you help me connect Grafana to Hopen Historian? Because I can’t retrieve the data.  
I created several instances in Manage Historian Instance to do different retentions.  
I have the tags in the first one but no data (DATA\_1\_day).  
I have nothing for the others.  
Thank you.

_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\1 jour; DataChannel={port=38402; interface=::0}; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_1\_jour; MaximumArchiveDays=1; WorkingDirectory=C:\Program Files\openHistorian\collecteur\1 jour_  
_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\2 jour; DataChannel={port=38403; interface=::0}; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_2\_jour; MaximumArchiveDays=2; WorkingDirectory=C:\Program Files\openHistorian\collecteur\2 jour_  
_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\1 semaine; DataChannel={port=38404; interface=::0}; DesiredRemainingSpace=1; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_1\_semaine; MaximumArchiveDays=7; WorkingDirectory=C:\Program Files\openHistorian\collecteur\1 semaine_  
_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\2 semaine; DataChannel={port=38405; interface=::0}; DesiredRemainingSpace=1; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_2\_semaine; MaximumArchiveDays=14; WorkingDirectory=C:\Program Files\openHistorian\collecteur\2 semaine_  
_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\1 moi; DataChannel={port=38406; interface=::0}; DesiredRemainingSpace=1; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_1\_moi; MaximumArchiveDays=31; WorkingDirectory=C:\Program Files\openHistorian\collecteur\1 moi_  
_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\2 moi; DataChannel={port=38407; interface=::0}; DesiredRemainingSpace=1; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_2\_moi; MaximumArchiveDays=62; WorkingDirectory=C:\Program Files\openHistorian\collecteur\2 moi_  
_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\4 moi; DataChannel={port=38408; interface=::0}; DesiredRemainingSpace=1; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_4\_moi; MaximumArchiveDays=124; WorkingDirectory=C:\Program Files\openHistorian\collecteur\4 moi_  
_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\6 moi; DataChannel={port=38409; interface=::0}; DesiredRemainingSpace=1; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_6\_moi; MaximumArchiveDays=62; WorkingDirectory=C:\Program Files\openHistorian\collecteur\6 moi_  
_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\1 an; DataChannel={port=38410; interface=::0}; DesiredRemainingSpace=1; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_1\_an; MaximumArchiveDays=365; WorkingDirectory=C:\Program Files\openHistorian\collecteur\1 an_  
_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\2 an; DataChannel={port=38411; interface=::0}; DesiredRemainingSpace=1; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_2\_an; MaximumArchiveDays=730; WorkingDirectory=C:\Program Files\openHistorian\collecteur\2 an_  
_-ArchiveCurtailmentInterval=3600; ArchiveDirectories=D:\Historian\archive\no limit; DataChannel={port=38412; interface=::0}; DesiredRemainingSpace=1; DesiredRemainingSpace=1; DirectoryNamingMode=Year; InstanceName=Data\_no\_limit; WorkingDirectory=C:\Program Files\openHistorian\collecteur\no limit_
