
オムロン製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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
ネットワークフォルダの中身を...
-
バッチファイル pause時の文字...
-
コマンドプロンプトで印刷実行
-
system関数のエラー検出
-
ネットワーク内のIPアドレス...
-
SDカードの初期化について
-
VB6.0でVISAを用いる
-
linux duコマンドで困っています。
-
PCに保存していた写真を見られ...
-
VBSでメール送信
-
拡張子をつくる
-
Subversion と TortoiseSVN で ...
-
FFFTP ミラーリングダウンロード
-
キャビネットファイルの破損・・・
-
メルカリを退会して再登録した...
-
ExcelのVBProjectがExcelを開く...
-
FFFTPの自動化バッチについて
-
同一フォルダ内に一見同じファ...
-
Excelで外部のファイルの場所を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
Visual C++からftpを使う
-
system関数のエラー検出
-
ネットワークフォルダの中身を...
-
テキストボックスのフォーカス...
-
ユーザーフォーム内のテキスト...
-
バッチファイル pause時の文字...
-
telnetで接続した先のコマンド...
-
コマンドプロンプトで印刷実行
-
Windowsのバッチファイルでcall...
-
EXCELで右クリックメニューの追加
-
シリアル通信でのread関数の戻り値
-
データリーダーからのデータ読...
-
バッチ(Windows2000)での解析エ...
-
FlashROMにデータを書き込むに...
-
ぱそこん、スマホのos、アプリ...
-
VBAチェックボックスで有効無効...
-
VBA チェックボックスの設定に...
-
コマンドボタンテキストの改行
-
SDカードの初期化について
おすすめ情報