Files
SequencerIO/arnold/__pycache__/io_driver.cpython-311.pyc

72 lines
11 KiB
Plaintext
Raw Normal View History

2026-03-02 17:48:55 -05:00
<EFBFBD>
3<0E>il <00><01><><00>dZddlmZddlZddlZddlZddlmZddlm Z ddl
m Z ddl m Z erdd lmZeje<11><00>ZGd
<EFBFBD>d e<13><00>ZGd <0C>d <0A><00>ZdS)u5
arnold/io_driver.py — Modbus TCP driver layer.
One IODriver instance per DeviceConfig. Handles:
- Connection management with transparent reconnect
- Bulk FC02 read of all input modules in a single request
- FC05 single coil write for outputs
- FC15 multiple coil write for bulk output operations
<EFBFBD>)<01> annotationsN)<01> TYPE_CHECKING)<01>ModbusTcpClient)<01>ModbusException)<01>ExceptionResponse<73>)<01> DeviceConfigc<01><00>eZdZdZdS)<03> DriverErrorz3Raised when a Modbus operation fails after retries.N)<04>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__<5F><00><00>+/home/noise/Code/arnold/arnold/io_driver.pyr r s<00><00><00><00><00><00>=<3D>=<3D>=<3D>=rr c<01>~<00>eZdZdd<05>Zdd<07>Zdd<08>Zdd <09>Zedd
<EFBFBD><04><00>Zdd <0C>Z d d<10>Z
d!d<12>Z d"d<14>Z d"d<15>Z d#d<18>Zd$d<1A>ZdS)%<25>IODriver<65>device<63>'DeviceConfig'<27>return<72>Nonec<01>|<00>||_tj<00><00>|_d|_d|_d|_d|_dS)NFr<00>)r<00> threading<6E>Lock<63>_lock<63>_client<6E>
_connected<EFBFBD>_connect_attempts<74>_last_connect_error)<02>selfrs r<00>__init__zIODriver.__init__!s<<00><00><1C><04> <0B><1F>n<EFBFBD>&<26>&<26><04>
<EFBFBD>/3<><04> <0C><1F><04><0F>!"<22><04><1E>(*<2A><04> <20> <20> r<00>boolc<01>l<00>|j5|<00><00><00>cddd<01><00>S#1swxYwYdS)z8Open the Modbus TCP connection. Returns True on success.N)r<00>_connect_locked<65>r"s r<00>connectzIODriver.connect-s}<00><00> <11>Z<EFBFBD> *<2A> *<2A><17>'<27>'<27>)<29>)<29> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A> *<2A><><EFBFBD><EFBFBD> *<2A> *<2A> *<2A> *<2A> *<2A> *s <00>)<03>-<07>-c<01>6<00>|j<00>+ |j<00><00><00>n#t$rYnwxYwt|jj|jjdd<02><03><00>|_|xjdz c_|j<00><00><00>}||_ |r<t<00> d|jj |jj|jj<00><00>nLd|jj<00>d|jj<00><00>|_ t<00>d|jj |j <00><00>|S)N<>r)<04>host<73>port<72>timeout<75>retrieszConnected to %s (%s:%d)zTCP connect failed to <20>:zCould not connect to %s: %s)r<00>close<73> Exceptionrrr+r,r r(r<00>log<6F>info<66>idr!<00>warning)r"<00>oks rr&zIODriver._connect_locked2s <00><00> <0F><<3C> #<23> <15><14> <0C>"<22>"<22>$<24>$<24>$<24>$<24><><1C> <15> <15> <15><14><04> <15><><EFBFBD><EFBFBD>'<27><15><1B>!<21><15><1B>!<21><15><15> 
<EFBFBD>
<EFBFBD>
<EFBFBD><04> <0C> <0A><1E><1E>!<21>#<23><1E><1E> <11>\<5C> !<21> !<21> #<23> #<23><02><1C><04><0F> <0A> a<01> <0F>H<EFBFBD>H<EFBFBD>.<2E><04> <0B><0E><04> <0B>@P<>RV<52>R]<5D>Rb<52> c<> c<> c<> c<>'e<><04> <0B>@P<>'e<>'e<>SW<53>S^<5E>Sc<53>'e<>'e<>D<EFBFBD> $<24> <0F>K<EFBFBD>K<EFBFBD>5<>t<EFBFBD>{<7B>~<7E>t<EFBFBD>G_<47> `<60> `<60> `<60><11> s <00>#<00>
0<03>0c<01><><00>|j5|jr+ |j<00><00><00>n#t$rYnwxYwd|_d|_ddd<00><00>dS#1swxYwYdS)NF)rrr0r1rr's r<00>
disconnectzIODriver.disconnectIs<><00><00> <11>Z<EFBFBD> <20> <20><13>|<7C> <19><19><18>L<EFBFBD>&<26>&<26>(<28>(<28>(<28>(<28><> <20><19><19><19><18>D<EFBFBD><19><><EFBFBD><EFBFBD>#<23>D<EFBFBD>O<EFBFBD><1F>D<EFBFBD>L<EFBFBD> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20><><EFBFBD><EFBFBD> <20> <20> <20> <20> <20> s,<00>A<03>+<02>A<03>
8<05>A<03>8<05>A<03>A<07>Ac<01><00>|jS)N)rr's r<00> connectedzIODriver.connectedSs
<00><00><13><EFBFBD>r<00>list[bool] | Nonec<01><><00>|j<00><00><00>}|sgS|j<00><00><00>}d}|j5|<00>||<02><00>}ddd<02><00>n #1swxYwY|S)z<>
Read all discrete inputs for this device in a single FC02 request.
Returns a flat list of bool (one per input point, in slot/point order),
or None on comms error.
rN)r<00> input_modules<65>total_input_pointsr<00>_read_discrete_inputs_locked)r"r=<00>total<61>
start_addr<EFBFBD>results r<00> read_inputszIODriver.read_inputs[s<><00><00> <1D> <0B>1<>1<>3<>3<> <0A><1C> <16><15>I<EFBFBD><14> <0B>.<2E>.<2E>0<>0<><05><16>
<EFBFBD> <11>Z<EFBFBD> J<01> J<01><19>6<>6<>z<EFBFBD>5<EFBFBD>I<>I<>F<EFBFBD> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01><><EFBFBD><EFBFBD> J<01> J<01> J<01> J<01><16> s<00>A#<03>#A'<07>*A'<07>address<73>int<6E>countc<01>t<00>td<01><00>D<00>]&}|js|<00><00><00>sdS |j<00>|||jj<00><03><00>}|<04><00><00>st|t<00><00>r.t<00> d|jj |<04><00>d|_<00><>t|jd|<02><00><00>cS#tt t"f$rP}t<00> d|jj |dz|<05><00>d|_t%jd<08><00>Yd}~<05><01> d}~wwxYwdS) z(Inner read; caller must hold self._lock.r*N)rDrF<00> device_idz%s: FC02 error response: %sFz%s: read error (attempt %d): %sr<><E79A99><EFBFBD><EFBFBD><EFBFBD>?)<14>rangerr&r<00>read_discrete_inputsr<00>unit_id<69>isError<6F>
isinstancerr2r5r4<00>list<73>bitsr<00>ConnectionError<6F>OSError<6F>time<6D>sleep)r"rDrF<00>attempt<70>rr<72>excs rr?z%IODriver._read_discrete_inputs_lockednsG<00><00><1C>Q<EFBFBD>x<EFBFBD>x<EFBFBD> !<21> !<21>G<EFBFBD><17>?<3F> <20><1B>+<2B>+<2B>-<2D>-<2D> <20><1F>4<EFBFBD>4<EFBFBD> !<21><19>\<5C>6<>6<>#<23>5<EFBFBD>"<22>k<EFBFBD>1<>7<><12><12><02><16>:<3A>:<3A><<3C><<3C><1D>:<3A>b<EFBFBD>2C<32>#D<>#D<><1D><17>K<EFBFBD>K<EFBFBD> =<3D>t<EFBFBD>{<7B>~<7E>r<EFBFBD>R<>R<>R<>&+<2B>D<EFBFBD>O<EFBFBD><1C><1B>B<EFBFBD>G<EFBFBD>F<EFBFBD>U<EFBFBD>F<EFBFBD>O<EFBFBD>,<2C>,<2C>,<2C>,<2C>,<2C><>#<23>_<EFBFBD>g<EFBFBD>><3E> !<21> !<21> !<21><13> <0B> <0B>=<3D>t<EFBFBD>{<7B>~<7E>w<EFBFBD>YZ<59>{<7B>\_<>`<60>`<60>`<60>"'<27><04><0F><14>
<EFBFBD>4<EFBFBD> <20> <20> <20> <20> <20> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD> !<21><><EFBFBD><EFBFBD>
<14>ts<00>A=C<02>0C<02>D5<05>%AD0<05>0D5<05> bool | Nonec<01><><00>|j5|<00>|d<01><00>}ddd<02><00>n #1swxYwY|<02>dS|dS)uGRead a single discrete input. Slower — prefer read_inputs() for bulk.rNr)rr?)r"rDrBs r<00>read_input_pointzIODriver.read_input_point<6E>s<><00><00> <11>Z<EFBFBD> C<01> C<01><19>6<>6<>w<EFBFBD><01>B<>B<>F<EFBFBD> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01> C<01><><EFBFBD><EFBFBD> C<01> C<01> C<01> C<01> <11>><3E><17>4<EFBFBD><15>a<EFBFBD>y<EFBFBD>s <00>+<03>/<07>/<07>valuec<01>p<00>|j5|<00>||<02><00>cddd<01><00>S#1swxYwYdS)z`
Write a single coil via FC05.
Returns True on success, False on error.
N)r<00>_write_coil_locked)r"rDr[s r<00> write_outputzIODriver.write_output<75>s<><00><00>
<12>Z<EFBFBD> ;<3B> ;<3B><17>*<2A>*<2A>7<EFBFBD>E<EFBFBD>:<3A>:<3A> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B><><EFBFBD><EFBFBD> ;<3B> ;<3B> ;<3B> ;<3B> ;<3B> ;s <00>+<03>/<07>/c<01><><00>td<01><00>D<00>]3}|js|<00><00><00>sdS |j<00>|||jj<00><03><00>}|<04><00><00>st|t<00><00>r/t<00> d|jj ||<04><00>d|_<00><>t<00> d|jj ||<02><00>dS#ttt f$rP}t<00> d|jj |dz|<05><00>d|_t#jd <09><00>Yd}~<05><01>-d}~wwxYwdS)
Nr*F)rDr[rHz#%s: FC05 error response addr=%d: %sz%s: wrote coil %d = %sTz %s: write error (attempt %d): %srrI)rJrr&r<00>
write_coilrrLrMrNrr2r5r4<00>debugrrQrRrSrT)r"rDr[rUrVrWs rr]zIODriver._write_coil_locked<65>sT<00><00><1C>Q<EFBFBD>x<EFBFBD>x<EFBFBD> !<21> !<21>G<EFBFBD><17>?<3F> !<21><1B>+<2B>+<2B>-<2D>-<2D>!<21> <20>5<EFBFBD>5<EFBFBD> !<21><19>\<5C>,<2C>,<2C>#<23><1F>"<22>k<EFBFBD>1<>-<2D><12><12><02>
<16>:<3A>:<3A><<3C><<3C><1D>:<3A>b<EFBFBD>2C<32>#D<>#D<><1D><17>K<EFBFBD>K<EFBFBD> E<>t<EFBFBD>{<7B>~<7E>W^<5E>`b<>c<>c<>c<>&+<2B>D<EFBFBD>O<EFBFBD><1C><13> <09> <09>2<>D<EFBFBD>K<EFBFBD>N<EFBFBD>G<EFBFBD>U<EFBFBD>S<>S<>S<><1B>t<EFBFBD>t<EFBFBD><74>#<23>_<EFBFBD>g<EFBFBD>><3E> !<21> !<21> !<21><13> <0B> <0B>><3E><04> <0B><0E>PW<50>Z[<5B>P[<5B>]`<60>a<>a<>a<>"'<27><04><0F><14>
<EFBFBD>4<EFBFBD> <20> <20> <20> <20> <20> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD> !<21><><EFBFBD><EFBFBD>
<15>us<00>A>C<02>1'C<02>E<05>2AD=<05>=E<05>values<65>
list[bool]c <01><><00>|j5td<01><00>D<00>]"}|js"|<00><00><00>sddd<02><00>dS |j<00>|||jj<00><04><00>}|<04><00><00>st|t<00><00>r/t<00> d|jj ||<04><00>d|_<00><>ddd<02><00>dS#ttt f$rP}t<00> d|jj |dz|<05><00>d|_t#jd <09><00>Yd}~<05><01>d}~wwxYw ddd<02><00>n #1swxYwYdS)
z\
Write multiple contiguous coils via FC15.
Returns True on success.
r*NF)rDrbrHz#%s: FC15 error response addr=%d: %sTz&%s: write_coils error (attempt %d): %srrI)rrJrr&r<00> write_coilsrrLrMrNrr2r5r4rrQrRrSrT)r"rDrbrUrVrWs r<00> write_outputszIODriver.write_outputs<74>s<><00><00>
<12>Z<EFBFBD> %<25> %<25> <20><11>8<EFBFBD>8<EFBFBD> %<25> %<25><07><1B><EFBFBD>%<25><1F>/<2F>/<2F>1<>1<>%<25>$<24>  %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25>
%<25><1D><1C>1<>1<> '<27>%<25>"&<26>+<2B>"5<>2<><16><16>B<EFBFBD>
<1A>z<EFBFBD>z<EFBFBD>|<7C>|<7C>!<21>z<EFBFBD>"<22>6G<36>'H<>'H<>!<21><1B> <0B> <0B>$I<>4<EFBFBD>;<3B>><3E>[b<>df<64>g<>g<>g<>*/<2F><04><0F> <20><1F> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25><> (<28><1F>'<27>B<>%<25>%<25>%<25><17>K<EFBFBD>K<EFBFBD> H<>$<24>+<2B>.<2E>Za<5A>de<64>Ze<5A>gj<67>k<>k<>k<>&+<2B>D<EFBFBD>O<EFBFBD><18>J<EFBFBD>t<EFBFBD>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24><><EFBFBD><EFBFBD><EFBFBD>%<25><><EFBFBD><EFBFBD> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25><><EFBFBD><EFBFBD> %<25> %<25> %<25> %<25>(<15>us=<00>/E <03>A>C<04>E <03>D9<07>)AD4<07>.E <03>4D9<07>9E <03> E <07>E <07>dictc<01>r<00>|jj|jj|jj|j|j|jpdd<01>S)N)rHr+r,r:<00>connect_attempts<74>
last_error)rr4r+r,rr r!r's r<00>statuszIODriver.status<75>s><00><00>"<22>k<EFBFBD>n<EFBFBD>"<22>k<EFBFBD>.<2E>"<22>k<EFBFBD>.<2E>"<22>o<EFBFBD> $<24> 6<>"<22>6<>><3E>$<24> 
<EFBFBD>
<EFBFBD>
rN)rrrr)rr$)rr)rr;)rDrErFrErr;)rDrErrX)rDrEr[r$rr$)rDrErbrcrr$)rrg)r r rr#r(r&r8<00>propertyr:rCr?rZr^r]rfrkrrrrr s<00><00><00><00><00><00>+<2B>+<2B>+<2B>+<2B>*<2A>*<2A>*<2A>*<2A>
<12><12><12><12>. <20> <20> <20> <20><0E><1F><1F><1F><0E>X<EFBFBD><1F><16><16><16><16>&<14><14><14><14>8<19><19><19><19>;<3B>;<3B>;<3B>;<3B><15><15><15><15>8<15><15><15><15>>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
rr)r<00>
__future__r<00>loggingrrS<00>typingr<00>pymodbus.clientr<00>pymodbus.exceptionsr<00> pymodbus.pdur<00>configr <00> getLoggerr r2r1r rrrr<00><module>rus<00><01><04><04>#<23>"<22>"<22>"<22>"<22>"<22><0E><0E><0E><0E><10><10><10><10> <0B> <0B> <0B> <0B> <20> <20> <20> <20> <20> <20>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A><10>%<25>$<24>$<24>$<24>$<24>$<24>$<24><17>g<EFBFBD><17><08>!<21>!<21><03>><3E>><3E>><3E>><3E>><3E>)<29>><3E>><3E>><3E>A
<EFBFBD>A
<EFBFBD>A
<EFBFBD>A
<EFBFBD>A
<EFBFBD>A
<EFBFBD>A
<EFBFBD>A
<EFBFBD>A
<EFBFBD>A
r