1/12/2023

Analog Discovery Studio - Logic Analyzer 사용후기

1. Analog Discovery Studio 

Analog Discovery Studio는 기본적으로  Analog Discovery 2와 동일하다. 
다만, 아래의 기능이 추가되어 확장되었을 뿐이다.
  1. Breadboard
  2. 외부 Power 
  3. Studio 전용 확장보드 
그러므로, 별도의 개별회로를 구성할 일 없다면, Analog Discovery2 를 추천한다. 

  • Analog Discovery2 의 DC Scope 사용법 
PCB Tool View 사용법 과 DC Scope 사용법 

  • Analog Discover2 의 기본기능 및 기본사용법 (AC Scope) 
각 기본기능과 관련 HW 정보 및  AC Scope/ WaveGen 기본사용법  (반드시 확인)

  • Analog Discovery2 와 Python
Analog Discovery2를 이용하여 얻은 정보를 Python 기반으로 사용확장 
추후 Matlab에도 연결하여 사용가능할 거 같음 

 
1.1 Analog Discovery Studio 관련정보 

Analog Discovery Studio는 Analog Discovery 2와 동일하므로, 관련정보가 없다면, 
Analog Discovery2에서 찾아 보도록 하자. 

  • Analog Discovery Studio 기본정보 
Analog Discovery Studio의 모든정보가 나오며, 반드시 확인 
매번 세부적으로 Project를 비롯하여, Guide 및 다양한 것이 추가되므로 반드시 확인  

  • Analog Discovery Studio HW Spec
확인해야 할 사항 항상 Spec에서 허용하는 값을 확인 Logic Analyzer는 CMOS기반으로 5v까지만 허용하지만, 3.3v로 사용 
(주의 5v가 허용이지만, 좀 무리가 될수있으므로 조심)  
  1. Analog Input: Oscilloscope, Voltmeter, Network Analyzer, Spectrum Analyzer
  2. Analog Output: Waveform Generator (shared w/ Spectrum/Network Analyzers?) 
  3. Digital Inputs and Outputs: Digital I/O, Digital Pattern Generator, Logic Analyzer
  4. 기타등등 


  • Analog Discovery 2 Hardware Design Guide
  1. ADC 회로구성
  2. DAC 회로구성 
  3. Digital 회로구성
  4. 이외 Power 구성등 
추후 시간이 더 있을 경우, 세부적 HW구성을 좀 더 확인하도록 하자. 

Analog Discovery2/Studio 의 전체 HW 구성확인가능(FPGA: Xilinx Spartan6)

상위 HW Design Guide는 상당히 좋은 자료이며, Scope/LogicAnalyzer를 직접 만들고 싶으면, 좋은 Reference가 될 것이다.
예전에 나의 경우도, 내가 직접 나만의 Scope/LogicAnalyzer를 만들고 싶어서 OpenSource 기반으로 많이 알아봤는데, 회로구성하는 문제로 많이 삽질했다. 
설사 HW만들어도 문제인게, 이를 지원해주는 Waveforms처럼 SW기능이 훨씬 더 필요하다. 


ADC 회로구성 Scope(Analog Input) 
완벽히 이해하기 어렵겠지만, 간단히 말해서 Voltage를 divide하고, Buffer사용하고, Driver 가져오는 형태이다. 

DAC 회로구성 WaveGen,AWG(Analog output)
역시 상위와 같이 Volatage를 Divide 하는 구조.  

Digital 회로구성 Logic/StaticIO/등
Digital은 FPGA(Sparatan6) CMOS와 연결되어 들어가므로, Voltage의 제약존재하며 주의해서 사용해야한다.
5V까지는 괜찮다고 하니, 그래도 좀 주의를 해서 사용하도록 하자. 
(ESD 보호회로 존재)


  • 3rd Party Programs (LabView/Matlab/ThingSpek)
  1. 예전에 Labview를 들어보기는 했는데,  회로구성을 해주는 Tool인걸로 보이며, NI에서 제공해주는 것 같다.
  2. 다 잘 알겠지만, Matlab AC Scope와 연결해서 Data Acquistion으로 사용하는 것보임
  3. Thingspeak는 Web으로 연결해서 사용하는 것으로 보임 
Labview

Matlab

Thingspeak

  • Waveforms Manual/Download
Waveforms 설치 Guide 와 Download (항상 최신버전으로)


1.2 Logic Analyzer 기능 

Scope 와 Logic Analyzer 기능을 동시에 사용이 가능한 것이 큰 장점인 것으로 보인다.  
다만, Logic Analyzer 사용 중에 Logic Analyzer기능을 좀 더 보완해주는 Digital Protocol 이 존재하는데, 이는 동시에 사용 못한다. 

  • Logic Analyzer HW 주의사항
상위 HW 에서 언급했지만, Scope가 아니므로, Volatage Level에 주의해서 사용하자
이는 Static IO도 동일하다. 


  • Logic Analyzer Trigger 
이전에 Scope에서 소개한 Simple /Pulse /Protocol 존재하여 다양한 Trigger 제공 
사실 이중 Trigger or Decode 기반의 세부 Protocol 분석기능은 별도로 없음 
(단순 Data분석만 가능한걸로 보임, 현재 UART만 사용해봄)

좀 더 확장하여 사용하고 싶다면, Digital Protocol로 변경해서 사용해야한다. 


화면캡쳐는 회사컴퓨터라서 불가능하여 포기


1.3 Digital Protocol 기능 

Logic Analyzer 와 Digital Protocol 기능은 동시에 사용하지 못하며, 상위 Logic Analyzer의 Decoding 기능확장이라고 생각하면 되겠다. 

이것으로 각 Interface의 전체적인 Flow 분석가능같은 Logic Analyzer 의 Decoding 기술이다. 
다만 이 기능이 너무 제한적이고 Custom이라는 것이 제공하며, 마치 많이 확장 가능한 것 같이 보이는데, 부족하다. 
추후 Waveforms Version 이 업그레이드 되면 나아질 것라고 생각든다. 

다만, UART의 경우, 921600가 최고로 측정가능한 것 같은데, 이것도 Packet Loss가 장난이 아니며, 데이타 깨지는 것도 많다.  
UART도 저속통신용으로 사용해야 할 걸로 생각들며, Buffer가 적다보니, Packet Loss가 장난이 아니다. 

기본적으로 SPI는 테스트를 못해봤지만, SPI 고속은 왠지 힘들 꺼 같으며, 내 기준으로는 많이 만족하지 못할 것 같다.  

일단 UART에서 기반으로 측정할때, 오류를 많이 보아서 좀 신뢰성이 많이 떨어진다. 
초보자라면, 오류라는 것도 감지를 못할 것 같다. 


화면캡쳐는 회사컴퓨터라서 불가능하여 포기


1.4 Saleae 와 Analog Discovery 비교 

Saleae의 Logic Pro16 과 비교해보면, Logic Analyzer의 Smaple Rate이 Analog Discovery가 많이 부족하며, 기능도 많이 부족해 보인다. 
만약 Scope 위주로 사용하고자 한다면, Anlog Dicovery를 추천을 하지만, Logic Analzer 위주로 생각한다면, 차라리 Saleae의 Logic Pro 16을 권하겠다.  


Saleae의 모델 과 Anaog Discovery Studio 비교 
  1. Logci Pro 16 : 500MS/s
  2. Analog Discovery Studio/2: 100MS/s 

Saleae


2. Logic Analyzer/Digital Protocol 측정후기 

일단 Saleae와 비교하면, Logic Anayzer 기능이 부족하다는 느낌이지만, WaveForms이 Upgrade되어, 개선이 되어진다면 괜찮을 것이라고 생각든다.

이외, BreadBoard 기반으로 StaticIO 와 외부 Trigger를 내가 회로 직접구성하여, Trigger도 될 것 같기도 하다. 
상위 구성을 하려면, 조금 복잡하겠지만, 일단 구성은 가능할 것 같은데, 아직 해보지는 안했으며, 될지도 확신을 못하겠다. 

더불어 Analog Discovery의 최대 장점이라고 하면, Scope 기능, Function/Pattern Generator,과 Audio가 될꺼 같으며, 
상위에서 언급한 다양한 Tool 과 연결성에 Python과 같이 연동도 되어지니, 정말 가성비는 끝내주는 것 같다.
그리고, Linux에서 Python으로 이관련 프로그램도 연결하여 구성도 할 수 있으니, 괜찮은 것 같다.  
Analog Discovery Studio는 Analog Discovery2 와 달리 Power 를 기본제공에, BreadBoard 기반으로 각 Switch 까지 제공하니, 
만약 MCU/MPU 가지고 놀기에는 최적이라고 생각든다. 

이 가격에 너무 많은 것을 바란다면, 나도 좀 그렇지만, 가성비를 생각하면 상당히 괜찮다고 생각든다. 
쓰면서, 매번 조금만, 조금만 하고 바라는 것들이 늘어날뿐이며, 현재 상태로는 만족한다.


다만 아쉬운 것 기능등
  1. Logic Analyzer 의 Decode Analyzer 분석기능 미제공 
  2. 한정된 Trigger의 조건 (너무 한정적)
  3. Logic Analyzer의 Sample Rate 
  4. Packet Loss 문제 

1/10/2023

RS485 Modbus 와 SCADA 시스템2

1. ESP32 회로구성 

이전에 ESP32 Modbus 관련하여 정리한 것이 그림 때문에 너무 긴거 같아, 다시 두개로 나누어 정리한다. 
더불어,RS485 와 Modbus를 분리하여, 잘못 안 부분이 있다면, 수정하도록 하겠다. 

RS232 와 RS485 회로구성 (ESP32 회로도 참조)


1.1 RS232 와 RS485 회로구성 

ESP32는 RS232만 지원가능하며, RS232는 Full Duplex이며, RS485는 Half Duplex 이다. 
Modbus를 구성하려면 두가지 방법이 있는데, ESP32에서만 제공하는 회로도만 보고, 이해했다가, 
현재 사용하고 USB제품을 통해 Echo/Non Echo 모드를 알게되었다. 


  • RS485 Mod 구성 (회로도)
  1. Echo Mode: 이전 ESP32 Sample 회로도 with CD(Collision Detection)기능 
  2. Non-Echo Mode: 이전 ESP32 Sample 회로도  without CD(Collision Detection) 기능 

Echo/Non-Echo Mode 관련내용 

문제는 CD(Collision Detection)기능이 있는 Echo Mode를 ESP32에서 완전히 제공하고 있지 않으므로, 주의해햐한다.
동작은 되지만, 멈추는 현상이 발생하며, ESP-IDF를 업그레이드 하면 추후에 제공될 것이겠지만, 현재 내 버전은 그렇지 않다. 


1.2 RS485 Bus 와 다른 Bus 구성 비교  

  • RS485의 Tranceiver 간의 비교 
RS485 Tranceiver VCC마다 다 다를수 있으며, VCC의 Range 정해져 있지, 동일한 Volatage로 사용여부는 정해져 있지 않다. 
이는 아래의 CSMA/CD에서 CD부분에서 자세히 설명하겠다. 

  • Ethernet 와 RS485 Tranceiver 비교  
Etherent과 비교하면, 구성면에서 있어서 비슷한 구성, VCC가 다 동일하며, Volatage 기반으로 Collision Detection이 가능하다  

  • USB 와 RS485 Tranceiver 비교  
USB과 비교하면, USB Master에서 VCC/VDD 나오며 전력도 제어하는 구조로 상위와 완전다르다. 
USB는 Power만 가지고도, 끝도 없이 이야기 할수 있으므로, USB 세부사항들은 아래참고 


1.3 RS485 의 CD(Collision Detection) 기능 

CSMA/CD or CSMA/CA는 대부분 Bus의 Layer 2에서 제공을 해주는 기능이며, 공용 Bus를 같이 사용하기 위해서 사용되는 기술이다.
간단하게 말해, 공용 Bus에서 TX를 하기전에, CS(Carrier Sense) 즉, Bus 이용중인지 확인하고, TX를 하고, 
Collision을 어떻게 감지(Detection)하는지 혹은 피하는 기능(Avoid)이며, 이로 인하여, 여러 Device들이 MA(Multiple Access)하여 같이 통신하는 것이다. 


Layer 2의 CSMA/CD(유선) 와 CSMA/CA(무선) 차이
CSMA/CD(유선): 대표적인 것이 Ehternet 
CSMA/CA(무선):  대표적인 것이 WIFI 

Ethernet과 비교하면, 예전의 Dummy Hub를 사용할때의 구성과 현재 RS485 구성 얼추 비슷하게 보인다. 
RS485는 CSMA/CD를  Layer2 즉, RS485 Tranceiver에서 처리못하고, 이를 RS232를 걸쳐 SW로 처리 해야한다. 

  • Ethernet의 CD(Collision Detection)
Ethernet의 경우, 예전에 Dummy Hub에 Station을 연결하면 할 수록 속도는 떨어진다.
이유는 Station들간에  충돌나면, Volatage 변경되어 CD(Collision Detection)발생하고, 이 때문에, 
JAM 신호를 보내어 모든 Device를 멈추게 한다. 
그리고, 이런일이 반복되어지면, Backoff Time이 더 늘어난다.  
결론적으로 Station을 추가하면 추가할수록 Bus 속도는 기하급수적으로 늦어진다. 

  • RS485의 CD(Collision Detection) 다른이유 
RS485와 Ethernet 의 비슷하지만, Voltage기반으로는 Collision Detection을 하기가 힘들다 .(이유는 간단하다.)
RS485 Tranceiver Differential Range가 넓어서, Bus에서 각 Device 의 RS485 Tranceiver 마다 구동되는 VCC가 다를수 있다.
예를들면, 같은 RS485 Bus 내에서도, 어떤 Device는 Voltage 3.3v 사용하고, 어떤 Device Voltage 5v를 사용가능하다.
이를 특정 Voltage Thrshold Level 정해서 Collision Detection으로 하기가 힘든 구조이다. 
(물론 HW 보완해서 하면 얼마든지 가능하다)

  • RS485 와 Volatage Range(-12v/+12V)
RS485의 Differential Voltage Range가 넓은 이유는 거리때문일 것이라고 생각한다.
간단히 생각해보면, 거리가 길어질 수록 선로는 길어지며, 선로 저항값이 점점 늘어난다. 


2. ESP32 Modbus 구성 

  • Modbus 협회 사이트 
Modbus Main 협회사이트인 것 같은데, 주요 볼 것은 검색해서 나오는 링크일 것 같으며, Member로는 등록을 안했다. 
 
  • ESP32의 Modbus 관련정보 
ESP32의 Modbus 지원내용과 API 관련내용을 자세히 설명 


2.1  Modbus의 기본구성 

Modbus를 검색만 해도 너무 많은 자료가 나오는데, 검색된 블로그 들어가서 글을 읽으면, 
아래내용과 틀린부분이 있어, 아래의 2개의 링크를 추천 

  • Modbus의 Protocol 관련 링크 
Modbus의 Protocol 설명과 실제 예제 및 분석과 비교 까지 해주어서 괜찮음 

Modbus 기본적인 설명이 잘 정리되어있으나, 상위와 용어가 조금씩 다름 주의 


  • Modbus의 Object(Data) Types
Modbus는 아래의 4가지 Type으로 Data접근가능.
2byte 전송형태와 1bit 전송형태 구분
이는 Read Only 와 Read Write 로 나뉨
Object typeAccessSizeAddress Space
CoilRead-write1 bit0x0000 – 0xFFFF
Discrete inputRead-only1 bit0x0000 – 0xFFFF
Input registerRead-only16 bits0x0000 – 0xFFFF
Holding registerRead-write16 bits0x0000 – 0xFFFF

Modbus를 하기위해서는 상위 각 Object Type Address Map을 정의해야하며, 이기반으로 통신 
Modbus RTU/ASCII 이건 둘 다 Function Code 기본으로 상위 Read/Write  넣음 

Input register/ Holding Register Map 구현예제 


  • Modbus Frame Format
Modbus Frame은 아래 ADU(Application Data Unit)로 구성되며, 다시 PDU(Protocol Data Unit)구성형태이다.
  1. ADU = Address + PDU + Error check
  2. PDU = Function code + Data

2.2 Modbus Frame 종류

Modbus Frame 종류와 각 Physical Interface 관계는 아래와 같으며, 이를 기반으로 연결되어 통신을 한다.
주로 가장 많이 사용되어지는 것이 Modbus RTU 와 Modbus TCP 인 것으로 보이며, 
이 두 개를 연결 Mapping하여 Serial <-> Ethernet에서도 Control 할 수 있는 구조로 확장해서 사용하기도 한다. 

  • Modbus Frame 종류
  1. Modbus RTU : Serial (RS232/RS485) Binary 목적으로 개발 
  2. Modbus ASCII : Serial (RS232/RS485) ASCII 을 이용  
  3. Modbus TCP:  TCP Protocol이 지원되며, 이는 Modbus RTU와 연결도 가능 

상위 내용을 보면, Modbus ASCII 보다는 RTU가 더 효율적으로 보이며, Modbus TCP 호환으로 보아도 
Modbus RTU를 사용해야 할 것 같다. 
** 상위 링크에서 Modbus RTU 와 ASCII를 비교가능 



Modbus RTU와 구조는 유사하지만, Binary용 전송이아니라, 세부사항들이 조금씩 다르며, DATA 기본단위도 2byte단위
  1. Start는 0x3A End는 0x0D,0x0A 로 감지목적사용 
  2. Address는 Station Address로 2byte 사용하여 총 247까지 사용가능
  3. Function는  2byte Object Type 방식을 선택되어지는 것으로 각 Function에 따라 동작 
  4. 상위 Object Type 방식에 Address Space는 DATA에 포함되며 세부사항은 Format 참조

주의: Modbus RTU 와 동일한 Data를 전송할 경우, 항상 2배의 Data 량을 소비

Unit Address (PLC Address): 2byte
  1. Address: 0  Broadcast 목적
  2. Address: 1 ~247, 각 Station의 Address로 이며 Unit Address 이라고도 함  (1byte)
Modbus PDUMax 253x2 = 506bytes
  1. Function:  아래 Wiki 참조 
  2. Data: Function에서 결정되며, 2byte 단위로 Encode 되어진다고 한다.
LRC: 2byte Checksum 이며, CRC가 아님 

NameLength (bytes)Function
Start1Starts with colon : (ASCII hex value is 3A)
Address2Station address
Function2Indicates the function codes like read coils / inputs
Datan × 2Data + length will be filled depending on the message type
LRC2Checksum (Longitudinal redundancy check)
End2Carriage return – line feed (CR/LF) pair (ASCII values of 0D0A


  1. Start/End는 0으로 RTU Packet의 감지목적으로 사용 
  2. Address는 Modbus RTU Slave의 Station Address로 1byte허용하여 총 247까지 사용가능
  3. Function는 상위 Object Type 방식을 선택되어지는 것으로 각 Function에 따라 동작 
  4. 상위 Object Type 방식에 Address Space는 DATA에 포함되며 세부사항은 Format 참조

Unit Address (PLC Address): 1byte
  1. Address: 0  Broadcast 목적
  2. Address: 1 ~247, 각 Station의 Address로 이며 Unit Address 이라고도 함  (1byte)
Modbus PDUMax 253 bytes
  1. Function:  아래 Wiki 참조 
  2. Data: Function에서 결정
CRC: 2bytes

총 256 Bytes

NameLength (bits)Function
Start28[citation needed]At least 3½ character times of silence (mark condition)
Address8Station address
Function8Indicates the function code; e.g., read coils/holding registers
Datan × 8Data + length will be filled depending on the message type
CRC16Cyclic redundancy check
End28[citation needed]At least 3½ character times of silence between frames

** 주의 : 상위 Length는 Bits 단위


상위 Frame과 호환성을 가지기 위해서 Function code와 Unit Identifier로 구성되며, 이는 Modbus RTU와 쉽게 호환 
  1. Transaction ID는 상위 Start/End 목적처럼 Sync를 위한 감지목적 
  2. Protocol ID는 Modbus TCP는 0 
  3. Unit ID는 기존의 Stations Adddress
  4. Function는 상위 Object Type 방식을 선택되어지는 것으로 각 Function에 따라 동작 
  5. 상위 Object Type 방식에 Address Space는 DATA에 포함되며 세부사항은 Format 참조
  6. Modbus RTU over TCP의 경우, 아래의 CRC가 추가. 

Unit Identifier (PLC Address): 1byte
  1. Address: 0  Broadcast 목적
  2. Address: 1 ~247, 각 Station의 Address로 이며 Unit Address 이라고도 함  (1byte)
Modbus PDUMax 253 bytes
  1. Function:  아래 Wiki 참조 
  2. Data: Function에서 결정
CRC:  Modbus RTU over TCP에서 사용 

NameLength (bytes)Function
Transaction identifier2For synchronization between messages of server and client
Protocol identifier20 for Modbus/TCP
Length field2Number of remaining bytes in this frame
Unit identifier1Server address (255 if not used)
Function code1Function codes as in other variants
Data bytesnData as response or commands

* Modbus RTU over TCP의 경우 상위 끝에 CRC추가되어 Modbus RTU와 호환가능 

  • 상위 모든 정보는 Wiki기반으로 가져온것이며 세부내용은 아래 참조 
세부내용은 특히 Function 및 동작순서는 아래 Wiki에 너무 자세히 잘 나옴 


2.3 Modbus Request /Response  분석 

아래는 동일한 Station Address / Function / Data 이용하여 각 Frame 마다 전송비교 분석이며, 이를 쉽게 이해 할 수 있다. 

  • Read Input Register 예제 분석 
1. Request: Address 200 의 Size 2개의 Data 요청
2. Response : Size:4 byte 와 Data 2개 (0x2710, 0xC350) 

-------------------------------------------------------------------------------------------------------------------------------------
                Request	                                              |  Response
-------------------------------------------------------------------------------------------------------------------------------------                 
Modbus ASCII    3A                                                    | 3A                                                             // MODBUS ASCII START
                30 31                                                 | 30 31                         (ASCII:01)                      // Station Address 0 1 
                30 34                                                 | 30 34                         (ASCII:04)                      // Function  0 4  
                30 30 43 38 30 30 30 32 (ASCII:00C80002)              | 30 34 32 37 31 30 43 33 35 30 (ASCII:04 27 10 C3 50 )       // Data x 2byte 
                33 31                                                 | 41 44                                                          // LRC (Checksum)
                0D 0A	                                              | 0D 0A                                                          // END (CR/LF)
--------------------------------------------------------------------------------------------------------------------------------------
Modbus RTU	01 	                                              | 01                                                             // MODBUS RTU: Station Address(Unit) 1 
                04                  	                              | 04                                                             // Function 4 Read Input Register 
        	00 C8 00 02        Address: 200  Size:2x2             | 04 27 10 C3 50           (Byte:4, Data:2 words)                // Data x 1byte  (Size, Data 2 Words)
        	F0 35	                                              | A0 39                                                          // CRC
--------------------------------------------------------------------------------------------------------------------------------------
Modbus TCP	00 14                                                 | 00 14                                                          // MODBUS TCP: Transaction ID 2byte
          	00 00                                                 | 00 00                                                          // Protocol ID 2byte 
          	00 06                                                 | 00 07                                                          // Length  2byte 
                01                                                    | 01                                                             // Station Address(Unit) 1
                04          	                                      | 04                                                             // Function 4
                00 C8 00 02	   Address: 200  Size:2x2             | 04 27 10 C3 50                                                 // Data x 1 byte
---------------------------------------------------------------------------------------------------------------------------------------

상위예제는 Station(Unit) 1 주소로 Function 4의 Request/Resonse 구조로 보내는 Data는 동일하다. 
간단히 보면, ASCII로 보낼 경우, Packet Size가 두 배가 되어진다. 
Protocol을 보면, RTU 와 TCP는 쉽게 호환되어지는 구조이다. 


  • Modbus-RTU Write 와 Exception 확인
상위와 동일하게 아래를 참조하여 분석하면 된다.
Slave에서 에러가 발생하면, Response에서 Function Code 90h 과 함께 Exception Code가 별도로 존재 


3. Modbus TEST 방법 

다양한 Tool이 존재하지만 유료도 존재하여 나의 경우 Python 기반으로 테스트를 진행하였다.
  • libmodbus 와 PyModbus 이용


3.1 Python 기반의 Pymodbus TEST 방법 및 분석  

Python Pymodbus Manual
현재 나도 이기반으로 TEST Program들을 작성했으며, 다양한 예제가 있어 편하다.

  • PC에서 ModbusTCP/RTU/ASCII Slave 테스트
PC가 Modbus Master가 되어 IOT (Modbus Slave) 테스트 할 경우 소스이며 각 Function에 관련된 함수에 따라 각각의 테스트 가능 
  1. 상위 read/write coill 및 read only discreate input 테스트 가능 (1bit)
  2. 상위 read/write holding register 및 read only input register 테스트 가능 (2byte)

보통의 경우, sync용 예제를 봐야하며, async의 경우는 빠르게 보내는 경우에 사용되어진다고 보면될꺼 같다.
내 생각으로는 sync 와 async의 차이는 아래라고 하는데 추후 다시 확인해야하겠지만, blocking 과  non-blocking 의 차이라고 생각되어짐 
기본적으로 Unix System programing or network programing 알면 대충 이해가 되실듯함 
  1. sync : request 와 responce를  각 확인 인 되어 동작 (blocking mode) 일 것 같음 
  2. async: request하고 response는  그냥 blocking 없이 동작 (non blocking mode) 일 것 같음 

# 간단하게 이런식으로 연결후 원하는 정보를 읽어서 확인하면 된다 
# pip install pymodbus 

from pymodbus.client.sync import ModbusSerialClient

def run_sync_client():
    
    client = ModbusSerialClient(
        method='rtu',
        port=Port,
        baudrate=Baud,
        timeout=3,
        parity='N',
        stopbits=1,
        bytesize=8
    )
    if client.connect(): 
        print('connected to Modbus Slave UNIT=',UNIT)
    else:
        print('failed to connect to the Modbus Slave UNIT=',UNIT)
    


  • PC의 PayloadBuilder 와 PayloadDecoder 사용 및 확인이유  
Holding Register와 Input Register는 기본적으로 2byte 통신이므로 Byte Order과 Word Order가 따라 결과 값이 달라질 수 있다. 
  1. Byte Order: BigEndian/ Little Endian : CPU에 종속됨 (Word의 저장되는 순서)
  2. Word Order: Big Endian / Little Endian:  소스에서 확인해봐야함
PayloadBuild의 경우 Slave도 Write를 할 경우가 발생하는데, 이때 Holding Register를 이용하여 Write할 때 필요 
PayloadDecoder의 경우 이를 다시 Decode를 할 경우 사용 

PayloadBuilder 예제 (주로 write시 사용)
2byte단위 통신이므로 다양한 포맷으로 변경 및 추가하여 이를 Packet 생성 

PayloadDecoder 예제 (주로 read시 사용)
2byte 단위 통신이므로 다른 포맷으로 변환시 사용 


ESP32의 내부 Ordering 확인사항 
사실 Word Order는 u16을 u32로 확장할 경우, 문제가 발생하는 것으로 보인다. (기본 32bit CPU의 word는 4byte)
예를들면 struct로 u16로 두개로 잡은 후에 이를 u16 pointer에서 u32로 변경할 경우 u16의 두개가 위치, 즉 address를  확인해야함
modbus 내부 api에서 변경할 가능성도 있으므로 이는 상위 wiki 세부확인

ESP32의 경우 내부적으로 분석해보면, ESP32의 경우 Bigendian 혹 정확히 말하며 Binary로 보내는게 맞다.   
이는 아래와 같이 Data 영역에 Byte Align으로 Data를 저장하여 이를 Memory 접근한다.

Byte Align 방법 
아래의 preprocessor로 1 byte align을 하여 byte ordering에 상관없이 사용하고 있다. 
#pragma pack(push, 1)
typedef struct
{
...
}...
#pragma pack(pop)

  • PC의 PayloadDecoder 결론사항 
PyModbus에서 입장에서 Byte OderBigEndian Word OrderLittel Endian으로 해야 Float32가 제대로 보인다 
개인생각으로는 PyModbus가 받은 Data를 함수내에 Stack영역에 저장하여 발생되어지는 문제로 생각되어진다.
u16->f32을 확장할 경우 PC(Program Counter) 의 Address 가 위로 증가 할지, 아래로 증가할지는 각 영역(Stack/BSS/Init)에 따라 달라진다 

현재 이 부분은 현재 PyModbus가 Data 저장을 Stack영역에 저장하여 상위와 같은 현상이 발생되어지는 것으로 생각되어진다. 


TEST Program 확인사항
상위를 먼저확인 후 Builder를 이용하여 u32으로 register를 write 한 후 decoder로 이를 재확인필요


ESP32의 Core Cadence의 Tensilica (Xtensa LX6) 


Xtensa 의 ABI (너무 간단하게만 나오며, 함수와 ELF 관련내용)
혹시 몰라 Xtensa의 ABI도 링크함, 
ARM이나, Power PC에 비해 너무 간단하게 나오며, 아마 다른문서가 있을 거라고 생각됨
일단, 간단하게만 알고나 있도록하자.  

1/06/2023

Analog Discovery2 - 기본 Scope 사용법

1. Analog Discovery 2 사용법

이전에 Linux 기반으로 Analog Discovery2 사용을 했는데, 목적은 Python 과 같이 사용하기 위해서 였다.  
하지만, 대부분 Window 기반으로 사용하기 때문에 Window용과 차이를 알아보고, 
간단하게 Scope로 DC Serial 인 UART를 테스트 해보도록 하겠다. 

  • Analog Discover2 의 기본기능 및 기본사용법 
각 기본기능과 관련 HW 정보 및  Scope AC/WaveGen 기본사용법  (반드시 확인)

  • Analog Discovery2 와 Python
Analog Discovery2를 이용하여 얻은 정보를 Python 기반으로 사용확장 
추후 Matlab에도 연결하여 사용가능할 거 같음 

  • 추후 측정해봐야 할 것 
Logic Analyzer 기능이며, 추후에 해보도록 하자. (귀찮다) 


1.1 Waveforms 설치 및 환설정 

Anlog Discovery2의 Window에서 설치하여 기본적으로 사용해보자. 

  • Waveforms Download
답변만 잘해주면, 무료로 Download 
Window 10 용 64bit 설치 
digilent.waveforms_v3.18.1_64bit.exe


  • 설치진행전 Analog Disvoery2 설정 
Scope를 사용할 것이므로, 아래와 같이 확장보드 연결 



Laptop의 USB Power만으로도 충분히 잘 돌아가며, 만약 Power가 부족하다면, 외부 전원사용 가능한 것 같다. 

https://digilent.com/reference/test-and-measurement/analog-discovery-2/start


  • Scope CH1 / CH2 
좌측 Scope CH1, CH2 은 Differential이 지원되며, 만약 Differential을 측정하고 한다면, Positivie/ Negative 와 Ground에 꽂아 측정하면 되겠다. 
  1. Scope 확장보드: BNC Connect 기반의 Passive Probe 연결하여 측정    
  2. Scope 확장보드: 점퍼로 AC/DC 선택 
  3. Scope 확장보드: MTE Connect (점퍼 Cable) 꽂아 Differential로도 측정 가능할 것 같다.

  • Analog Discovery2  Hardware Degine Guide
Analog Discovery2의 전체 HW 구성확인가능(FPGA: Xilinx Spartan6)

  • Analog Discovery2 Spec 비교 
혹시 나중에, Power Supplies로 사용한다면, 반드시 외부전원을 가지고 있어야함
항상 사용하기전에 각 사용가능한 Spec을 확인 


Analog Discovery2를 USB로 연결하고, Waveforms을 실행해보도록 하자. 

  • Waveforms 기본실행 
Scope 선택 


이전 Linux 용 WaveForms 버전보다 많은 기능을 더 제공을 해주고 있어 일단 놀랐다. 
매번 개선되고 있구나 하고 느낀다. 




1.2 Scope 측정 전 준비사항 

UART의 DC 신호를 측정할 것이므로 아래와 같이 설정하여 준비하도록하자. 
회로도 와 PCB Tool을 잘 이용가능하다면, 아래와 같이 하자. 

  • UART를 측정 전 Anlog Discovery2 설정  
  1. Scope 확장보드:  DC 변경 
  2. Scope 확장보드:  CH1 에 Passive Probe 연결 

  • 회로도 View Tools 설치  
OrCad도 있으며 좋고, 없으며 PDF보고 확인하자. 

  • 점검 전 PCB Tool View 설치
나는 이미 Pads Layout Viewer 설치했으며, 아래에서 Download 하자 

  • Board 측정할 포인터 확인 
OrCad or PDF 회로도 기반에서 우선 측정할 부분의 Pin 과 Unit을 기억하고, 현재 Board에서 찾아보자 

만약 Board에서 Probe로 측정할 포인터를 찾았다면,  
   * Unit의 1번 Pin 표시를 찾거나, TEST Point를 찾아 찍도록 하자. 

측정 포인트를 찾지를 못할 경우, 혹은 애매한 경우는 
   * PCB Tool View에서 찍을 포인터들을 직접 찾자 
  1. Setup->Display Colors 실행 
  2. Top 과 Bottom Layer 확인
  3. Top or Bottom Layer 만 각각 확인하여 상위 Unit 과 Pin을 찾자 
  4. Select Net or Selct Net Pair을 이용하여 각 Pin의 연결된 전체부분 Board에서 확인
  5. Pin 정보를 확인 

납땜을 할 수 있으면 좋은데, 현재 나의 경우는 못하므로 Probe만 직접 측정하도록 하자. 
대신 화면 캡쳐를 할때에는 Scope Mode를 변경하면된다. 


1.3 Scope 측정방법 (UART)

일반적인 Scope처럼 사용하면 되며, 각 Auto/Normal 모드가 지원가능 (Single모드는 좌측) 

  • Scope 관련기본설정 
  1. X축 설정 (Horizon, Time Domain)
    1. 우측 Time 설정 or 마우스로 시간설정 
  2. Y축 설정 (Vertical , Amp Domain)
    1. 우측 Channel 1 설정 
      1. Offset: 0
      2. Range: 1V/div   
  3. Trigger Mode 설정
    1. Type: Edge
    2. Condition: Rising 
    3. Level: Trigger Level 값 설정 or 마우스로 Trigger Level 값 설정
  4. Scope 모드 설정 
    1. Auto or Normal 모드 
  5. Run 실행 

VDD찾아 측정 v3.3 or V5 측정을 하여 Scope의 기본동작을 확인 (Auto모드)


1.3 Scope 측정분석 (UART)


  • UART 기본측정 
아래와 같이 기본측정하고 이 기반으로 분석가능한 것들 찾아보도록 하자. 

  • Measurement 
Measurement 를 선택하면 Scope에서 X/Y 측정가능 기능들이 나온다. 
일반 Scope 에서 제공해주는 기능이지만, 더 많은 기능을 제공하는 것 같다.  
DC RMS를 측정 혹은 Duty or Period 등 다양하게 측정해보도록 하자 


 
HW Datasheet와 함께 확인 
예를들면, Srew Rate 같은 것을 측정하고자 한다면, Rise Time 보면 될 것이다. 
세부적인 측정은 각 Chip의 Data Sheet의 Timing 도들을 참조하여 비교하면 된다. 
Scope로 하는 일이 바로 이런일이다.  


  • Logging or Rec. or Export or Audio
Logging: 측정한 data 저장이며, CSV로 저장가능하며, Excel로 쉽게 확인 및 Python으로 도 쉽게 연결 
일반 Scope 라면, 외부 USB 연결하여 좀 복잡한데,  간단하게 PC에 저장가능하니 자주 사용해보자. 
Rec.:  Binary로 16bit로 저장 (무슨 Data Format인지)
Export: 사진. 
Audio: C1 /C2가 되는 거 보니, PCM으로 저장가능 할것으로 예상 

다양하게 제공하고 있어, AC/DC 잘 사용가능할 것 같음  


  • +XY or +XYZ 3D
CH1 , CH2 에서 들어오는 각 Amp Domain(Vertical) 정보 값들을  X: CH1, Y:CH2 로 변경하여 볼 수 있다.  
이외 +Zoom 등 다양한 기능들이 있다. 



  • X Cursors/Y Cursors
Scope에서 제공하는 Cursor 기능을 제공해주고 있으며, 아래와 같이 사용가능 
아래와 같이 무식하게 일단 다 설정하고 했는데, 각 Delta 값으로 변화 및 관련사항이 확인가능한 것 같다.
일반 커서는 마우스로도 되는 것 같다. 


  • Digital
이 기능은 원래는 Logic Analyzer 기반용으만 사용가능한 것 같다. 
하지만 Scope에서 각종 저속 Serial 통신이 분석하여, 지원해주질 모르니, 추후 더 나아진 WaveForms에서 확인 



* 주의: DIO0은 상위 Logic Analyzer 용 Pin
만약 추후 C1/C0이 되어진다면, 그 때는 Scope로 Logic Anayzer 기능도 될 꺼 같다. 


Normal Mode 한 다음 아래와 같이 Digital 세부 분석가능



Digtial 창
T 메뉴에서 Trigger를 다양하게 설정 가능 

Trigger 설정 
  1. T. Simple : Trigger 각Edge, 각Level, T를 누르면 선택가능 
  2. Pulse : 각 종 Pulse 기반의 Trigger
  3. Protocol : 각 Serial 통신의 값 기반의 Trigger 

* 주의: DIO0은 상위 Logic Analyzer 용 Pin
아래의 기능이 제대로 동작안됨 


이 Trigger는 UART 값기반의 Trigger 




Cursor는 상위 보다, 아래처럼 마우스 우클릭으로 정하고 하면 쉽게 측정 



아래처럼 X축을 움직이면서 Cursor를 이용하여 측정 (Measure: Vertical)



  • 주의사항 
처음에 Scope에서 Logic Analyzer 기능을 사용할 수 있는 줄 알았는데, 안되는 것 같다.
아래 Manual 을 보면, Logic Analyzer Pin으로 변경해서 해야지만 되는 것으로 보인다.  
추후에 개선이 되어 Scope에서도 될 지도 모르겠으나, 현재로는 안되는 것으로 파악 


관련 Manual 

Script 확장기능


1.3 Scope 측정후기(UART)

마침 UART를 Debugging 할일이 있어, 기본적으로 사용했는데, 대체적으로 만족했으며, 괜찮은 것 같다. 
다만, SPI를 비롯하여, 고속 SPI도 추후에 가능한다면 그때 다시 해보도록하자. (Scope와 Logic Analyzer 두개 다)  
저번처럼 AC로 Scope를 분석한게 아니라 DC로 했기 때문에, 많은 기능을 사용 못해 보았지만, 일반 Scope보다, 
PC 호환성과 Analog Discovery가 제공해주는 다양한 기능 때문에 낫은 것 같다. 

나의 경우, 예전에 Scope를 회사일로 중고로 구입하고 다시 팔았는데, 지금은 매번 메일로 각 중고 Scope 가격 정보 살펴보는데, 
사실 요즘 거의 비싼 Scope는 구지 필요 없다는 생각이 많이 든다. 
Scope로는 거의 저속 interface 와 Timing을 보기위해서 사용하므로 비싼 Scope 사용은 거의 필요가 없을 질 듯 하다.  
어차피 고속 Serial Interface의 debugging은 Scope로 파악 하기가 너무 힘들며, 그나마 좀 Bandwidth가 높은 게 간혹 좀 필요한데,  
만약, 필요해서 측정해야 한다면, 그때가서 생각하도록 하자.  


다만, 사용하면서 아쉬운 기능
  1. Trigger 기능: 괜찮은 Scope일 경우 2중 Trigger 혹은 다양한 Trigger를 제공하는데 미제공 
  2. 각 신호분석: 각 Decoder 미제공 UART 안됨 (추후 될지도 모름) 
  3. Analog Video 신호분석 (NTSC/PAL/등): 미제공, 이제 이런기능은 필요 없을 것 같다. 
  4. Bandwith 문제: 너무 낮음, 30MHz
  5. SampleRate 문제: 너무 낮음, 100MHz

다만 Trigger 기능은 추후 waveforms이 업그레이드 되면, 더 개선 될수 있을 것 같기도 하며, 
Scope에서  Logic Analyzer 기능 도 되기를 바랄 뿐이다. 
싼가격에 많은 걸을 바라면 좀 그렇지만, 그래도 바랄뿐이다. 

Analog Discovery 30MHz Bandwith는 너무 낮은 것으로 보이며, 요즘 거의 보통 GHz 단위로 Bandwith를 사용한다. 
(다시 생각해보면, 저속통신에 GHz 는?? 필요 없을 듯하다.)

다만, Digital 파형이 존재했다는 것을 파악할 수 있으므로, 그것만으로 만족하도록하자. 
또한 Sample Rate도 역시 낮으며, 이는 추후 갑자기 생기는 Noise 파형신호를 놓칠 수도 있다.
그러므로, 상위 상황문제들을 정확히 알고 사용을 해야한다. 


Bandwith란? Scope역시 기본 오차가 존재하며,Sine 파형이 3db 감소하는 부분이라고 하는데, 정확한 이해는 나도 모르겠다. 
다만, Bandwith가 낮으면, DC로 측정하면, DC의 경우 여러파형이 합쳐진 존재이므로, 이에 대한 파형이 정확하게 측정이 되어지지지 않는다
쉽게 생각하면, 푸리에 이론으로 간단히 생각할 수 있다. 즉, 주파수 Bandwith가 좁아져서 생기는 문제로 파악되어진다. 
여러 파형이 합쳐진 것이 DC이며, 이를 제대로 표현하려면 여러 파형이 있어야 하는데, 
Bandwith 부족하면, 파형갯수가 부족하여 DC 파형이 뭉게지는 것으로 보면된다. 

시간축의 얼마나 Sample을 하냐 이거인데, 이게 낮을 경우 역시 Noise 파형을 놓칠 수도 있다. 
또한 Bandwith가 낮은것 처럼 정확한 신호 표현이 안되어지며, 보여진 신호가 깨진다. 

상위 두개를 테스트 해보고자 하면, 좋은 Scope에서 Bandwith 와 Sample Rate를 변경해보면 쉽게 파악 가능하다. 
더불어 흔히들 Scope하면, 고급브랜드들만 선호하는데, 각 사용 해보면 괜찮은 것들이 많으므로, 
Manual을 보고 간단히 사용해보고 판단했으면 좋겠다.