2016-07-06 4 views
0

USB-to-RS485- 인터페이스 (반이중 USB485)를 통해 컴퓨터 (Linux 16.04)로 진공 게이지 (이전 모델 https://www.pfeiffer-vacuum.com/en/products/measurement/digiline/gauges/?detailPdoId=13238&request_locale=en_US)에서 데이터를 송수신하려고합니다. -STISO (http://www.hjelmslund.dk/)). 특정 프로토콜을 사용하여 게이지에 요청을 보내면 요청에 응답해야하고 인터페이스로 수신 할 수 있어야합니다. 나는 데이터를 보내지 만 데이터를 보낼 때마다 아무것도 돌아 오지 않는 것으로 보인다. Node.js를 사용하여이 작업을 수행하려고합니다. 지금까지 사용한 코드는 다음과 같습니다.Nodejs를 사용하는 USB-to-RS485

function pack(address, action, parameter, data) { 
    var length = String('00' + data.length.toString()).slice(-2); 
    var bufferAsString = address + action + parameter + length + data; 
    var check = 0; 
    for (var i = 0; i < bufferAsString.length; ++i) { 
     check += bufferAsString.charCodeAt(i) 
    } 
    var checkSum = String('000' + String(check % 256)).slice(-3); 
    var buffer = Buffer.from(bufferAsString + checkSum), 
     carriageReturn = Buffer.from('\r'); 
    return Buffer.concat([buffer, carriageReturn]); 
} 

var serialPort = require('serialport'); 
var SerialPort = serialPort.SerialPort; 

var port = new SerialPort('/dev/ttyUSB0', { 
    baudrate: 9600, 
    dataBits: 8, 
    stopBits: 1, 
    parity: 'none' 
}, false); 
port.open(function(err) { 
    if (err) { 
     return console.log('Error opening port: ', err.message); 
    } 
    console.log(port.isOpen()); 
    port.on('data', function (data) { 
     console.log('Data: ' + data); 
    }); 
    port.on('close', function() { 
     console.log('port closed') 
    }); 
    var sendBuffer = pack('001', '00', '740', '=?'); 
    setInterval(function() { 
     port.write(sendBuffer, function(err, bytes) { 
      console.log('send' + bytes) 
     }); 
     port.drain(); 
    }, 1000) 
}); 

압력을 측정하기 위해 게이지에 매 초마다 요청을 보내야합니다. TxD-Led가 곧 매초 깜박하기 때문에 요청이 전송되고 있음을 안다. 그러나 나는 그 요청에 아무 대답도받지 못한다. 나는 또한 파이썬과 터미널을 통해 데이터를 전송하는 다른 방법을 시도했지만 비슷한 성공을 거뒀습니다. 송신을위한 녹색 램프가 항상 점멸하지만 아무런 반응이 없으며 응답이 수신되지 않습니다. 나는 다음에 무엇을 시도해야 할지를 놓치고 있으며, 당신이 줄 수있는 어떤 도움에 정말로 감사 할 것입니다.

업데이트 : 좋아, 그럼 내가 한 가지 가능한 오류를 발견 한 것 같습니다. 저는 뭔가를 보낼 때 인터페이스에서 빠져 나가는 신호를 캡처하기 위해 오실로 스코프 (oszilloscope)로 작업하고있었습니다. 나는 하나의 ascii 문자로 시작하여 가장 기본적인 신호가 제대로 전달되는지 확인했다. ascii '0'의 경우 전송되는 신호는 10000011001이고 ascii '1'의 경우 10100011001입니다. 따라서이 신호는 2 개의 startbits가있는 것을 제외하고는 거의 예상대로입니다. 일반적으로 나는 단지 1 개의 시작 비트 만있을 것으로 기대합니다. 전송 된 시작 비트의 양을 변경하는 방법이 있습니까?

Signal of ASCII '0' Signal of ASCII '1'

+0

RS485 양단이 동일한 두 개의 와이어를 송신 즉 차동 쌍 반이중으로서 모두 D + 및 D-을 사용 같이, D- 변화된다는 사실은 센서가 송신되는 전혀 표시하지 어느 한쪽 끝이 D +와 D-를 모두 전송할 때 달라지기 때문입니다. 예 RS485는 반이중이지만 PC와 센서 사이의 프로토콜에는 데이터를 요청하는 PC와 센서가 관련되어있을 것입니다. 양측은 프로토콜을 알고 협조하여 충돌을 방지합니다. 대부분 요청한 형식이 잘못되었거나 체크섬이 잘못되었을 수 있습니다. 체크섬 계산의 유효성을 검사 할 수 있습니까? – barny

+0

가능한 오류 소스를 줄이기 위해 먼저 직렬 터미널 프로그램을 사용하여 연결을 시도합니다. 수동으로 명령 문자열을 보내고 응답이 있는지 확인하십시오. 명령이 모두 ASCII처럼 보이고 \ r으로 끝나는 것처럼 보입니다 (endianness에 대한 걱정이 없습니다, ralf). "0010074002 =? ccc \ r"여기서 ccc는 10 진수의 체크섬이며 LHS는 3 자로 제로 패딩됩니다. 체크섬은 모듈러스 256 (즉, 000-255) 앞에있는 문자의 모든 값을 간단한 십진수로 더한 것입니다. 0010074002 =? 나는 체크섬 106을 만든다. 그래서 완전한 명령은 "0010074002 =? 106 \ r"이어야한다. 예? – barny

+0

계기 설명서에서 예제 요청을 사용하고 있으므로 체크섬이 정확해야합니다. 체크섬이 정확하지 않더라도 적어도 게이지가 오류를 돌려 보내야한다고 생각합니다. 나는 당신이 '0010074002 =? 106 \ r'(요청에있는 데이터의 길이를 잊어 버린 것)과 비슷한 예제를 사용했다. 그래서 리눅스에서 screen을 사용하여 직렬 포트에 연결한다면이 문자열을 보내려면 정확히 무엇을해야할까요? 죄송합니다. 전에 정말로 이런 종류의 일을 한적이 없었습니다. –

답변

0

이것이 통신 문제 : 여기에 Oszilloscope의 출력이다

1 체크 전송 속도, 패리티 시작 같은 프로토콜 기반 통신 파라미터 -/stop-bits MODBUS, Profibu와 같은 다른 프로토콜 (RS-485에서 UART 프로토콜을 사용하는 경우 () s, ... 가능할 수도 있습니다.

게이지가 통신에 9600 보 (baud)를 사용하는 경우 명령에 115200 보 (baud)를 사용할 수 없습니다. nodejs 코드에서는 매개 변수를 설정하지 않습니다 (nodej 때문에 UART 프로토콜을 사용한다고 가정합니다). 게이지는 다른 프로토콜을 사용하는 경우 전송 속도, 패리티, ... 다른 프로토콜 노드 JS 시리얼 모듈의 코드 https://en.wikipedia.org/wiki/RS-485

같은 매개 변수가 설정되지 않은에도 불구하고 nodejs 코드는 작동하지 않습니다

http://libmodbus.org/

http://www.pbmaster.org/

2 확인 proprieta를 사용할 수 없다 계시판에 계신 명령을 보내십시오. 내 멀티 미터의 데이터를 읽고 싶을 때 나는 = 0100 0100 (bin) 대답 (endianness?)을 얻으려면 ASCII를 보내야 만한다. 나는 다른 값을 보내면 멀티 미터는 침묵을 유지한다.

http://electronicdesign.com/what-s-difference-between/what-s-difference-between-rs-232-and-rs-485-serial-interfaces

+0

1) 새 포트를 정의 할 때 표준 매개 변수가 이미 필요하기 때문에 (통신 속도 9600, 패리티 없음, 데이터 베이트 8 개, 정지 비트 1 개 2) 통신 매개 변수에 대한 옵션을 무료로 남겨 둡니다. 전송은 Pfeiffer 프로토콜에 의해 정의됩니다. 처음 3 비트는 게이지의 주소이며, 동작 표시기 (2bits), 매개 변수 (3bits), 데이터 길이, 데이터 및 체크섬 뒤에 캐리지가옵니다. –

+0

아아, 프로토콜은 실제로 UART입니다. 명확하게하기 위해 노드에 UART 매개 변수를 삽입하십시오. * flow control *과 같은 다른 UART 매개 변수가 있습니다. 이것도 확인하고 삽입하십시오. 그렇지 않으면 이것이 모두 정확한 것인가? 명령에서의 엔디 언 때문일 것입니다. –

+0

* 흐름 제어 *는 RS-232에만 해당하며 http://www.electronicspoint.com/threads/flow-control-in-rs485.25678/에 따라 RS-485에 없습니다. –