
オムロン製PLCと上位コンピュータをRS232Cで接続し、FINSコマンドを用いてシリアル通信をしようとしています。
現在作っているプログラムの流れは、
・シリアルポート"/dev/ttyS2"のオープン
comm_fd = open("/dev/ttyS2", O_RDWR | O_NOCTTY);
・通信設定
termios構造体を設定
・コマンドフレーム(COMMAND)を作成し、ポートに書き込む
write(comm_fd, &COMMAND, strlen(COMMAND));
・PLCからのレスポンスを読み出す
read(comm_fd, &RESPONSE, 256);
のようにしているのですが、read関数が実行されたままになってしまいます。(エラーコードも返ってこない状態です)
readの戻り値が-1ならポートにアクセスできていないとわかるのですが…
ためしにcomm_fdと違う値をread関数に入れてみたところ(read(6, &RESPONSE, 256)、戻り値は-1となりました。
これはどういう状態になってしまっているのでしょうか?
わかりにくい質問で申し訳ありません。
No.2ベストアンサー
- 回答日時:
PLCはttyS2に接続されていますか?
接続が正しいのであれば、termiosの設定が気になります。
newtio.c_iflag = (IGNPAR | ICRNL); みたいになってないと
readが改行受信で戻ってこずに、256バイト読むまで待っているかもしれません。
回答ありがとうございます。
ご指摘のようにtermiosの設定で"c_cc[VMIN]=1;"としていたためreadが開始されていませんでした。writeで信号がPLCに送信できていなかったため、レスポンスがなかったようです。
申し訳ないのですが、ポートから信号を出せるようにするにはどのような設定が必要なのか、アドバイスがありましたら教えていただけないでしょうか?
No.1
- 回答日時:
PLCはちゃんとコマンドを受け取って返信しているの? それを確かめた?
通信速度その他の通信設定が違ってて通信できてないんじゃないの?
RS232Cなんて基本的に無手順で垂れ流しだから上手く通信できなきゃいつまでも結果が返ってこないからreadから戻らないでしょ。
この回答への補足
追加の質問で申し訳ありません。
いろいろ試しているのですが、writeしてもポートから信号が出ていません。
PLCのシステム設定で、通信速度9600、データ7ビット、2ストップビット、偶数パリティとしています。
プログラム側の設定は、
tio.c_cflag &= ~(CSIZE | PARODD | HUPCL);
tio.c_cflag |= CS7 | CLOCAL | CREAD |PARENB | CSTOPB;
cfsetospeed(&tio, B9600);
cfsetispeed(&tio, B9600);
としています。
よろしければアドバイスお願いいたします。
回答ありがとうございます。
read関数は通信設定で"c_cc[VMIN] = 1;"としていたため、読み込みできていないということがわかりました。結局、writeしてもポートから信号が出ていなかったためPLCから返事もこなかっただけでした。
関数をきちんと理解できていなかったための質問で申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- 英語 The more books you read, the more you’ll know. この文 2 2022/04/16 14:06
- Visual Basic(VBA) Excelのマクロについて教えてください。 1 2023/03/12 12:16
- USBメモリー・SDカード・フラッシュメモリー 銀行が振込データの受け渡しに未だにFDを使っている理由は「FDDがAドライブ固定だから」って本当? 11 2022/06/02 03:53
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- 英語 【 論・表 受動態 】 問題 ※写真の② 私の解答 This novel was read by m 3 2022/06/24 19:15
このQ&Aを見た人はこんなQ&Aも見ています
-
ソケット通信内 read関数について
C言語・C++・C#
-
コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法
C言語・C++・C#
-
C言語とシリアル通信の送受信データの概念
C言語・C++・C#
-
-
4
C# シリアル通信でデータ受信時の欠損について
C言語・C++・C#
-
5
Linuxでのシリアル通信についてですが、受信のときにデータがずれた状態で送られてくることがあります
C言語・C++・C#
-
6
シリアル通信の出力バッファと送信完了イベントについて
C言語・C++・C#
-
7
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
8
RS232C通信のC言語プログラム:入力モード?
C言語・C++・C#
-
9
LINUX上でシリアル通信(C++)
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windowsのバッチファイルでcall...
-
ネットワークフォルダの中身を...
-
OUTLOOKで受信メールを開くとテ...
-
Teratermマクロの戻り値の取得失敗
-
バッチ(Windows2000)での解析エ...
-
VBAのことで質問があります
-
ユーザーフォーム内のテキスト...
-
VBで定期的にタイムサーバに時...
-
コマンドプロンプトでサービス...
-
Visual C++からftpを使う
-
Office 2011 VBA フォルダ作成
-
Gitで空白のみの変更を削除した...
-
popen使用時のエラー出力を出し...
-
ExcelVBA WorkSheet上の全てのC...
-
データリーダーからのデータ読...
-
telnetで接続した先のコマンド...
-
VBSで指定した時刻にメッセージ...
-
コマンドプロンプトで印刷実行
-
バッチファイル pause時の文字...
-
シリアル通信でのread関数の戻り値
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
ネットワークフォルダの中身を...
-
Windowsのバッチファイルでcall...
-
テキストボックスのフォーカス...
-
バッチ(Windows2000)での解析エ...
-
EXCELで右クリックメニューの追加
-
ユーザーフォーム内のテキスト...
-
コマンドプロンプトでサービス...
-
シリアル通信でのread関数の戻り値
-
バッチファイル pause時の文字...
-
データリーダーからのデータ読...
-
コマンドプロンプトで印刷実行
-
system関数のエラー検出
-
telnetで接続した先のコマンド...
-
VBAチェックボックスで有効無効...
-
リストボックス2に表示されたフ...
-
VBSで指定した時刻にメッセージ...
-
VBで定期的にタイムサーバに時...
-
表示を標準か改ページプレビュ...
-
ExcelVBA WorkSheet上の全てのC...
おすすめ情報