PAT, At-Line Cell/Metabolite Analyzers & In-Line Spectroscopy Integration Guide
Connecting Nova Biomedical BioProfile® FLEX2, Beckman Coulter Vi-CELL™ BLU, Roche Cedex® Bio HT, Endress+Hauser Raman Rxn2™/Rxn4™, and Hamilton Arc® / Mettler Toledo Sensors to GxPHistorian GxP Industrial Historian
1. Overview: Bridging PAT & At-Line Analytical Data into the Historian
In modern Upstream and Downstream bioprocessing, online bioreactor probes (Temperature, pH, DO) tell only half the story. Critical Quality Attributes (CQAs) and biological state metrics—Viable Cell Density (VCD), Cell Viability (%), Glucose, Lactate, Glutamine, Glutamate, Ammonium (), Osmolality, and Monoclonal Antibody (IgG) Titer—are measured by:
- At-Line Automated Cell & Metabolite Analyzers:
- Nova Biomedical BioProfile® FLEX2 (coupled with the BioProfile® Automated Sampler or Flownamics® Seg-Flow® online sampling system)
- Beckman Coulter Vi-CELL™ BLU (automated Trypan Blue imaging cell viability analyzer)
- Roche CustomBiotech Cedex® Bio HT & Cedex® HiRes (high-throughput metabolite, substrate, and IgG titer analyzer)
- In-Line PAT Spectroscopy & Smart Sensors:
- Endress+Hauser (Kaiser) Raman Rxn2™ / Rxn4™ Bioprocess Analyzer (in situ Raman spectroscopy predicting real-time glucose, lactate, VCD, and antibody titer for closed-loop nutrient feeding)
- Hamilton Arc® (Incyte® Permittivity/Biomass, VisiFerm™ Optical DO, EasyFerm™ pH) & Mettler Toledo InPro® / M800 Transmitters

1.5 Non-Technical Step-by-Step Physical & Software Connection Walkthrough
Lab scientists and PAT engineers can connect all five instrument families to GxPHistorian without writing custom vendor drivers by following this physical port and menu guide:
| PAT Instrument | Where to Plug In on the Physical Unit | Exact Touchscreen / PC Software Menu Click-Path | How GxPHistorian Ingests It |
|---|---|---|---|
| 1. Nova Biomedical BioProfile® FLEX2 (+ Seg-Flow® Autosampler) | Look at the rear panel, lower-left corner next to the power cord. Plug a Cat6 Ethernet cable into the RJ45 Network Port. (If using a Flownamics Seg-Flow® 4800 autosampler, also connect its rear RJ45 port to the same lab switch). | Log in as Admin on the FLEX2 touchscreen Setup System Configuration Network / OPC. Enter Static IP 10.20.50.10, check Enable OPC UA Server (Port 4840), and also enable Auto-Export CSV to Network Share (\\10.20.10.50\gxphistorian_ufl\incoming\flex2). | Telegraf [[inputs.opcua]] OR ufl_file_collector.py (is_step_tag = true, exc_dev = 0.0) |
| 2. Beckman Coulter Vi-CELL™ BLU | Look at the back of the Vi-CELL BLU benchtop unit (or the rear of the integrated Windows 10 PC). Plug a Cat6 Ethernet cable into the RJ45 LAN port. | Log in to Vi-CELL BLU software as Administrator Setup (Gear Icon) System Connectivity / Automation. Toggle Enable OPC UA Server = ON (Port 4840 or 49320) and enable Auto-Export Sample CSV on completion. | Telegraf [[inputs.opcua]] (is_step_tag = true, exc_dev = 0.0) |
| 3. Roche CustomBiotech Cedex® Bio HT / Cedex® HiRes | The Cedex Bio HT analyzer connects to its local Cedex Control Center Windows PC over USB/Serial. Plug a Cat6 cable into NIC 2 (or a USB-to-Ethernet adapter) on the Cedex PC. | Open Cedex Control Center System Configuration Data Export / Host Interface. Check Automatic Result Archiving after Each Measurement and set the export folder to \\10.20.10.50\gxphistorian_ufl\incoming\cedex_bio_ht. | ufl_file_collector.py parses VesselID, SampleTimestamp, GLC, LAC, IGG with SHA-256 seal |
| 4. Endress+Hauser (Kaiser) Raman Rxn2™ / Rxn4™ | Fiber-optic immersion probes (bIO-Optic) connect to the 4-Channel Laser Unit, which connects to the Embedded Analyzer Rear RJ45 Ethernet Port. Plug a Cat6A cable into the rear RJ45 port. | In Raman RunTime™ (or SIMCA®-online), go to Configuration Communications OPC UA / Modbus. Enable OPC UA Server (Port 4840) to publish predicted Chemometric PLS concentrations (Predicted_Glucose_g_L, Predicted_Lactate_g_L, Predicted_VCD, Hotelling_T2, DModX). | Telegraf [[inputs.opcua]] (is_step_tag = false, continuous 1–5 min scans) |
5. Hamilton Arc® Smart Probes (Incyte VCD, VisiFerm DO, EasyFerm pH) | Screw an 8-Pin M12 Sensor Cable (Hamilton Ref 242079) onto the top of the probe head. Connect the pigtail wires (RS-485 D+, D-, GND, +24V DC) into a Moxa MGate MB3180 Modbus gateway (or Hamilton Arc Wi 2G adapter). | Connect your smartphone/tablet via Bluetooth to the probe using the Hamilton ArcAir® App (with Advanced role). Verify Modbus RTU Slave Address (1..32, unique per probe on the daisy chain) and Baud Rate = 19200, 8, N, 2. | Telegraf [[inputs.modbus]] polls IEEE-754 FLOAT32 registers (2088, 2408) every 1 s |
2. Integration Architecture
flowchart LR
subgraph PAT["PAT & Bioprocess Analytical Instruments"]
FLEX["Nova BioProfile® FLEX2\n(+ Seg-Flow® / OPC Server)"]
VICELL["Beckman Coulter Vi-CELL™ BLU\n(Embedded OPC UA Server)"]
CEDEX["Roche Cedex® Bio HT\n(CSV/XML Archive Export)"]
RAMAN["Endress+Hauser Raman Rxn2™/Rxn4™\n(Raman RunTime™ OPC UA / Modbus)"]
HAM["Hamilton Arc® Incyte® / VisiFerm™\n(Modbus TCP / OPC UA)"]
end
subgraph Edge["Pillar 1: Edge Collector (edge-collector)"]
OPCUA["Telegraf [[inputs.opcua]]"]
MOD["Telegraf [[inputs.modbus]]"]
WATCH["PAT Watchfolder & Sample Bridge\n(HTTP POST :8080/ingest)"]
WAL["Telegraf Disk WAL Buffer\n(/var/lib/telegraf/buffer)"]
OPCUA --> WAL
MOD --> WAL
WATCH --> WAL
end
subgraph Core["GxPHistorian GxP Historian"]
CH["ClickHouse 24.8 Archive\n(pi_historian.sensor_data)"]
PG["PostgreSQL 16 Control Plane\n(is_step_tag=true for Sparse Assays)"]
API["FastAPI Control Plane\n(DataLink LOCF + Event Frames)"]
end
FLEX -->|"OPC UA / OPC DA"| OPCUA
VICELL -->|"OPC UA (:4840)"| OPCUA
CEDEX -->|"Signed Result File"| WATCH
FLEX -.->|"CSV Export"| WATCH
RAMAN -->|"OPC UA (:4840)"| OPCUA
HAM -->|"Modbus TCP (:502)"| MOD
WAL -->|"JSONEachRow"| CH
PG <--> API <--> CH3. Golden Rules for Sparse At-Line Analytical Samples in GxPHistorian
Unlike a 1 Hz thermocouple, an at-line BioProfile® FLEX2, Vi-CELL™ BLU, or Cedex® Bio HT produces a discrete analytical result vector once every 1 to 12 hours per bioreactor vessel. To prevent data loss or interpolation distortion:
- Set
exc_dev = 0.0(Zero Deadband Suppression): Every analytical sample is a GMP record. Settingexc_dev = 0.0guarantees that two consecutive identical assay results (e.g.,Viability = 98.4%followed 6 hours later by98.4%) are both archived. - Set
is_step_tag = true(LOCFStep Interpolation): When process engineers pull hourly tables in Excel (=PI_SAMPLED_DATA()) or overlay offline glucose with online Raman glucose in Grafana,is_step_tag = trueuses Last Observation Carried Forward (LOCF) so a pre-feed glucose measurement of1.8 g/Lat 08:00 and a post-bolus measurement of6.0 g/Lat 14:00 do not create a synthetic linear ramp across the morning. - Map Vessel ID from the Sample Name: Multi-vessel analyzers serve 4 to 24 bioreactors. Route each result to the specific bioreactor’s
tag_idin PostgreSQL (BioCorp.Fremont.USP.Bioreactor_201vs.Bioreactor_202) using the sample’sVesselID/SampleIDprefix. - Preserve the Explicit Sample Draw Timestamp (
ts): Always pass the analyzer’sSampleTimestamp(in UTC epoch milliseconds) in thetsfield of the JSON payload sent tohttp://edge-collector:8080/ingest. Telegraf’s JSON transformation inedge-collector/telegraf-clickhouse.conf("ts": $exists(fields.ts) ? fields.ts : timestamp) preserves the exact time the sample was drawn from the bioreactor rather than the time the assay completed.
4. Instrument-Specific Integration Configurations
4.1 Nova Biomedical BioProfile® FLEX2 (OPC Server & Seg-Flow® Autosampler)
The BioProfile® FLEX2 combines up to 5 analytical modules:
- Chemistry/Biosensor Module: Glucose (
g/L), Lactate (g/L), Glutamine (mmol/L), Glutamate (mmol/L), Ammonium (mmol/L) - pH / Blood Gas Module: pH, (
mmHg), (mmHg) - Cell Density / Viability (CDV) Module: Total Cell Density (
10^6 cells/mL), Viable Cell Density (10^6 cells/mL), Viability (%), Cell Diameter () - Osmolality Module: Osmolality (
mOsm/kg)
Connection via BioProfile OPC UA / Seg-Flow® OPC Server
Configure edge-collector/telegraf-clickhouse.conf to subscribe to the FLEX2 / Seg-Flow OPC UA namespace for Bioreactor_201:
[[inputs.opcua]] name = "sensor_data" endpoint = "opc.tcp://10.20.50.10:4840/BioProfileOPC" security_policy = "Basic256Sha256" security_mode = "SignAndEncrypt" certificate = "/etc/telegraf/certs/gxphistorian_client_cert.pem" private_key = "/etc/telegraf/certs/gxphistorian_client_key.pem"
nodes = [ { name = "val", namespace = "2", identifier_type = "s", identifier = "FLEX2.BR201.Gluc", default_tags = { tag_id = "501" } }, { name = "val", namespace = "2", identifier_type = "s", identifier = "FLEX2.BR201.Lac", default_tags = { tag_id = "502" } }, { name = "val", namespace = "2", identifier_type = "s", identifier = "FLEX2.BR201.NH4", default_tags = { tag_id = "503" } }, { name = "val", namespace = "2", identifier_type = "s", identifier = "FLEX2.BR201.VCD", default_tags = { tag_id = "504" } }, { name = "val", namespace = "2", identifier_type = "s", identifier = "FLEX2.BR201.Viability", default_tags = { tag_id = "505" } }, { name = "val", namespace = "2", identifier_type = "s", identifier = "FLEX2.BR201.Osm", default_tags = { tag_id = "506" } } ](If using the legacy Windows COM BioProfile OPC DA Server, run edge-collector/scripts/opcda_windows_forwarder.py on the FLEX2 workstation with exc_dev = 0.0.)
4.2 Beckman Coulter Vi-CELL™ BLU (Native Embedded OPC UA Server)
The Vi-CELL™ BLU includes an embedded, 21 CFR Part 11 compliant OPC UA Server designed for direct bioprocess automation and historian connectivity.
- Endpoint:
opc.tcp://<vicell-blu-ip>:4840(or configured port in the Vi-CELL BLU Admin console) - Key Exposed Nodes:
ViCellBlu.SampleResult.SampleID(String — e.g.,"BR201_DAY04_S1", stored instr_val)ViCellBlu.SampleResult.ViableCellsPerMl(10^6 cells/mL)ViCellBlu.SampleResult.TotalCellsPerMl(10^6 cells/mL)ViCellBlu.SampleResult.ViabilityPercent(%)ViCellBlu.SampleResult.AverageViableDiameter()
4.3 Roche CustomBiotech Cedex® Bio HT (Watchfolder CSV/XML to :8080/ingest Worker)
Because Roche Cedex® Bio HT commonly exports validated result archives as structured CSV/TXT/XML files to a network share (or via an LDMS drop folder), you can stream Cedex results directly into edge-collector:8080/ingest using a lightweight Python worker patterned after opcda_windows_forwarder.py:
#!/usr/bin/env python3"""Example PAT File-to-Historian Bridge for Roche Cedex Bio HT & BioProfile FLEX2 CSV Exports.Parses validated assay exports, preserves exact sample draw timestamp (UTC ms),and posts normalized JSON batches to edge-collector (:8080/ingest)."""import csvimport datetime as dtimport pathlibimport httpx
TAG_MAP = { ("BR201", "GLC2B"): 501, # Glucose (g/L) ("BR201", "LAC2B"): 502, # Lactate (g/L) ("BR201", "NH3B"): 503, # Ammonia (mmol/L) ("BR201", "IGG2B"): 507, # IgG Titer (g/L) ("BR201", "LDHB"): 508, # LDH (U/L - cell lysis indicator)}
def ingest_cedex_csv(csv_path: pathlib.Path, ingest_url: str = "http://localhost:8080/ingest") -> None: batch = [] with csv_path.open("r", encoding="utf-8") as fh: reader = csv.DictReader(fh, delimiter=";") for row in reader: vessel = row["SampleID"].split("_")[0].upper() assay = row["TestCode"].upper() tag_id = TAG_MAP.get((vessel, assay)) if tag_id is None: continue sample_dt = dt.datetime.fromisoformat(row["SampleTimeUTC"]).replace(tzinfo=dt.timezone.utc) batch.append({ "tag_id": tag_id, "ts": int(sample_dt.timestamp() * 1000), "val": float(row["ResultValue"]), "str_val": row["SampleID"], "quality": 192 if row.get("Flag", "OK") == "OK" else 64, "status_code": 0, }) if batch: httpx.post(ingest_url, json=batch, timeout=5.0).raise_for_status()4.4 Endress+Hauser (Kaiser) Raman Rxn2™ / Rxn4™ & Hamilton Arc® Smart Sensors
Endress+Hauser Raman Rxn2™ / Rxn4™ (In-Line Raman Spectroscopy)
The Raman Rxn analyzer acquires in situ spectra via an immersible BioOptic™ probe and executes chemometric Partial Least Squares (PLS) models (in Raman RunTime™ or Sartorius Umetrics™ SIMCA®-online) every 1–5 minutes.
- OPC UA Integration: Connect
edge-collectorto Raman RunTime’s embedded OPC UA server (opc.tcp://<raman-rxn-ip>:4840) or SIMCA-online OPC UA server to archive predictedRaman_Glucose_g_L,Raman_Lactate_g_L,Raman_VCD_10e6_mL,Raman_Titer_g_L, and model diagnostics (Hotelling_T2,DModXspectral residual). - Quality Mapping: Map chemometric outlier flags (
DModX > DModX_Crit) toquality = 64(Uncertain) so automated glucose feed controllers and GMP rollups immediately recognize out-of-calibration spectra.
Hamilton Arc® (Incyte® Permittivity, VisiFerm™ DO, EasyFerm™ pH) & Mettler Toledo M800
Hamilton Incyte® sensors measure dielectric permittivity (, pF/cm) at multiple radio frequencies to track viable cell biomass continuously in real time without micro-carrier or cell-clumping interference.
- Connected either via the bioreactor PLC (OPC UA) or directly via Modbus TCP (
[[inputs.modbus]]intelegraf-clickhouse.conf) to read permittivity (pF/cm), conductivity (mS/cm), optical DO (%Sat), and sensor health diagnostics (Electrode_Quality_%,Glass_Impedance_MOhm).
5. Provisioning PAT & Metabolite Tags via the 21 CFR Part 11 API
# Provision At-Line Glucose (Tag 501, Step/LOCF) and Online Raman Glucose (Tag 511, Linear)curl -s -X POST http://localhost:8020/api/v1/tags \ -H "Content-Type: application/json" \ -H "X-Actor-Id: operator_01" \ -H "X-Change-Reason: Provision BioProfile FLEX2 At-Line Glucose tag for Bioreactor 201" \ -d '{ "tag_id": 501, "tag_name": "BR201_FLEX2_GLUC_PV", "asset_id": 1, "attribute_name": "AtLine_Glucose_PV", "eng_units": "g/L", "is_step_tag": true, "exc_dev": 0.0, "low_limit": 1.0, "high_limit": 8.0, "source_protocol": "OPC_UA", "source_config": {"node_id": "ns=2;s=FLEX2.BR201.Gluc", "archetype": "SPARSE_PAT_ASSAY"} }' | jq .
curl -s -X POST http://localhost:8020/api/v1/tags \ -H "Content-Type: application/json" \ -H "X-Actor-Id: operator_01" \ -H "X-Change-Reason: Provision Raman Rxn2 In-Line Glucose PAT prediction tag for Bioreactor 201" \ -d '{ "tag_id": 511, "tag_name": "BR201_RAMAN_GLUC_PV", "asset_id": 1, "attribute_name": "InLine_Raman_Glucose_PV", "eng_units": "g/L", "is_step_tag": false, "exc_dev": 0.02, "low_limit": 1.0, "high_limit": 8.0, "source_protocol": "OPC_UA", "source_config": {"node_id": "ns=2;s=RamanRunTime.BR201.Predicted_Glucose", "sampling_ms": 60000} }' | jq .