2016年11月15日火曜日

無線LAN繋がらなくなる障害の一つとして

本社事務所に設置している同じ型の2つの無線アクセスポイントの一つが不定期に繋がりづらくなり、しまいにはネットワーク障害が起こっていた。

対策として
全PCのIP固定化
SSIDの再設定
チャンネル設定
モバイルテザリングの排除
ローミングの廃止
時刻設定

対策という対策をしてもこればかりは不定期に障害が発生していた。
そのアクセスポイントから接続されたPCへPINGが通らない。
アクセスポイントを再起動すると正常に動作する。

途方に暮れていたある日、ふとその障害が動力系コンセントの付近に設置していると思い、その付近に関係ないと思われる場所のコンセントから電源を供給してみた。

そうすると最低でも週1で発生していた障害が10日たった現在、まったく発生していない。

動力系はプリンターである。
レーザープリンター、ドットインパクトプリンターと接続されている同じタップから供給していた。
その付近にはFAX複合機も2台ある。

もしかすると、タイミングが悪い場合に瞬間的に電圧が足りない場合を考える必要があるのか?
たまに瞬電(瞬断)が起こる時が目に見えて判るチャンスではないかと思う。
その時に確認してみようと思う。

それにしても現在、平和な状況が訪れている。そうであって願いたい

2016年7月4日月曜日

無線LANが切れる、繋がらないの不具合

無線LANを快適に運用するには
いろいろ悩みました。

理想としては以下の条件がよろしいかと
無線親機が1台
使用範囲見通し10~15m以内
固定IP運用
セキュリティオプションがあればKey更新間隔 0
接続端末5台以内(同時)

これで問題があるのであれば親機に問題があると思います。


それ以外の条件としてここからが問題を複雑にしています

■無線親機が複数
チャンネルは出来るだけ離す
SSIDは同じしない
設置場所は近くにしない(接続台数が相当数ある場合と考えられます)

■リピーターを使用
リピーターを使用する場合リピーター近辺で接続してしまうと
親機とリピーターのSSIDを取り合うらしく接続が意味なく切断される
親機の届かない範囲のリピータだけの電波が届く場所で使用することが条件となる

なので移動式の媒体はSSIDの取り合いで無線LANの接続が切れる場合がある
(電波が弱くなっても使えるギリギリまで接続を離さないので近い同じSSIDであってもそれと接続しないし、タイミングによっては同じSSIDでも親機が違うと無線接続のキーが一致しない現象も発生するようで接続できているように見えてもインターネットが出来ないといったおかしな状態になる)

そこでリピーターの性能で使用方法を考えなければならない

受ける電波は親機のSSIDでリピーターの先は違うSSIDが設定出来る機種か?
これができれば違うSSIDを設定する。パスワードは一緒でも構わない

出来ない場合(MZK-EX300N2など)は使用する場所と接続する端末の位置を考えること

電波設定が重複しやすい場所は必ずインターネットが不安定になります。
(親機のSSIDを受けて、リピーターから出す電波が親機と同じ設定であれば、その周辺で使用する端末は両方の電波設定の影響をモロにうけて混乱が始まります)
その場合は無線親機、リピーター、端末を再起動
しかし一旦は正常になってもしばらくすると不安定になるので解決にはならない

ローミングをしたい場合は受信側の性能に関わってきます
あまりお勧めはしません。KeyEnceハンディあたりはその部分が良くできていると思います。
同じSSIDでチャンネルを変更して配置しても接続が出来なくなる不具合がありません。
電波干渉の配慮は大事ですがPCの無線LANよりははるかに接続が安定します


以上の条件を踏まえるとSSIDは一緒にしない
チャンネルは出来るだけ離す
SSIDが複数の場合は使用する端末は全てのSSIDを登録する(自動接続設定をしておけば移動出来るようになる)

同じSSIDが複数ある場合の運用は素人には相当難しいということがわかった
これをやめてからは問題がほとんど起きなくなった

ちなみに2.4GHZは電子レンジ使用時は諦めること






 

2016年3月14日月曜日

ACCESS2013ランタイムのバーコード表示

バーコード表示するプログラムはバージョンによっては表示出来ないことがあったが、ランタイム上で表示出来ない場合、バーコードに対応するDLLが不足している場合がある

不足しているDLL

MSBARCODE.DLL

開発出来る端末からコピーして同じ場所に貼りつけると表示されるようになるが端末が多い場合は最初からセットしたほうがよさそうだ

C:\Program Files (x86)\Microsoft Office\Office15

通常はこの場所(64bit)の場合

製品版では気にする必要がないが、他にも同じようなことがあるのだろうか



2016年2月12日金曜日

リモートデスクトップログアウト時にデスクトップを表示

windows8.1
リモートデスクトップを閉じた際に、サーバ側の PC がログオン画面のままになるのを回避する場合以下のコマンドが有効
tscon.exe RDP-Tcp#0 /dest:console
batファイルとして作成して、りモートデスクトップ終了時に管理者で実行するとログオフしリモートされたPCはデスクトップを表示するはずであった。
しかし、何度もは入ったり出たりすると#0の部分が#1,#2と変わってしまうので作動しなくなる結果に。

それで動的にヒットするまで処理を回したらどうだということで以下のコマンドを走らせてみた


for /L %%e in (1,1,100) do tscon.exe RDP-Tcp#%%e /dest:console


とりあえず1~100まで処理をすれと

そうすることで安定してログアウトが可能になった。

100を超えるくらい出たり入ったりするならばパラメータを変更すれば良い


あまり美しくは無いがまずは良しとしよう

2016年2月9日火曜日

タスクスケジューラに登録したバッチファイルが動かない

バッチファイルが動かない!のをなんとかする方法
要するに作業ディレクトリを設定しないといけないようです、上の画像は作業ディレクトリを設定する画面
タスクのプロパティ⇒操作タブ⇒操作の編集⇒開始(オプション)(T)に作業ディレクトリを指定してやれば良いみたいです、このパラメータを入れなかったので「パラメータが不適切」だと怒られたのですね。
この場合だと 開始(オプション)(T) に作業ディレクトリ(実行するプログラムが入っているフォルダ)を指定するので。
d:\wwwroot\awstats\cgi-bin\ と入力してやればOKです。
また別の方法もあるようで、バッチファイルに作業ディレクトリを指定してもよいみたいですのでこの方法で行います。



バッチファイルに赤文字部分を追加
cd /D %~dp0
cd “d:\wwwroot\awstats\cgi-bin”
awstats.pl -config=awstats.conf -update
cd コマンドの 「/D オプションは ドライブ及びディレクトリをパラメータで指定した場所に移動」するものです、「%~dp0 とは実行されているファイルが置かれているカレントディレクトリ」の事です、つまりバッチファイルを実行している場所にドライブとディレクトリを移動すると言う意味だそうで、上記のタスク設定画面に入力するのと同じ事のようです。


2015年1月9日金曜日

KEYENCEハンディでプログラム開発 マイクロソフトACCESSを使う

KEYENCE(キーエンス)ハンディのプログラム開発で
マイクロソフトのACCESSを使用したスキャン検品システムを構築
特殊な開発ツールは全く必要なく出来あがりました。

応用するとエクセルのVBAでもおそらく可能です。
しいて言えば、音の制御はVBを使用するスキルは必要になります。

この環境で運用するにはある程度条件が必要になります

1)1秒間に3~4回以上の速さを求めるスキャニングには適さない
2)リモートデスクトップを使用するので、台数が多くなると管理が難しい
3)BEEP音の制御はVBも同時に制御する必要がある
4)無線LAN設備と配置問題(ローミング設定は比較的容易)

以上の条件を考えるとやはり大規模向けには少し問題があると感じます。
小規模で1)のような速さが必要なければ導入コストが通常の場合と比較にならないくらい格段に下がりますので導入検討の余地は十分にあると思います。

MSACCESS開発をしているところであれば容易に作成可能です

具体的な導入方法はまた後で紹介したいと思います。







2014年12月26日金曜日

ACCESSからVB.netへ 文字を送信

ACCESSから起動できないプログラムでVBからは起動できる
そんな場合にACCESSからパラメータとして文字送信をし
VBで受け取りその内容に応じて処理を行う
windows32 APIを利用 SendMessage

送信側  (ACCESS)

Option Compare Database
Option Explicit

'ウィンドウハンドル取得
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'子ウィンドウハンドル取得
Private Declare Function FindWindowExA Lib "user32" _
    (ByVal hpar As Long, ByVal hchi As Long, ByVal cnm As String, ByVal cap As String) As Long
'メッセージ送信
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Const WM_COPYDATA = &H4A
Private Type COPYDATASTRUCT
    dwData As Long
    cbData As Long
    lpData As String
End Type


Function strSend()
    Dim hWnd As Long
    Dim sdtCOPYDATASTRUCT As COPYDATASTRUCT
    Dim txtSendData As String
    txtSendData = "ABCDEFG"

    Dim Ret As Long
    '送信データ格納
    sdtCOPYDATASTRUCT.dwData = 0
    sdtCOPYDATASTRUCT.cbData = LenB(txtSendData) + 1
    If Nz(txtSendData, "") = "" Then
        sdtCOPYDATASTRUCT.lpData = vbNullChar
    Else
        sdtCOPYDATASTRUCT.lpData = txtSendData  '送信データ
    End If
    '受信側のウィンドウハンドル取得
    hWnd = FindWindow(vbNullString, "フォーム名")

    If hWnd <> 0 Then
        Call SendMessage(hWnd, WM_COPYDATA, 0, sdtCOPYDATASTRUCT)
    End If

End Function


受信側  VB.NET

 'COPYDATASTRUCT構造体
    Public Structure COPYDATASTRUCT
        Public dwData As IntPtr   '送信する32ビット値
        Public cbData As Int32        'lpDataのバイト数
        Public lpData As String     '送信するデータへのポインタ(0も可能)
    End Structure
    Public Const WM_COPYDATA As Int32 = &H4A
    Public Const WM_USER As Int32 = &H400
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_USER
                '数値が送信されて来た
                TextBox1.Text = m.WParam.ToString()
                'txtInt2.Text = m.LParam.ToString()
            Case WM_COPYDATA
                '文字が送信されて来た
                Dim mystr As COPYDATASTRUCT = New COPYDATASTRUCT()
                Dim mytype As Type = mystr.GetType()
                mystr = CType(m.GetLParam(mytype), COPYDATASTRUCT)
                TextBox1.Text = mystr.lpData
        End Select
        MyBase.WndProc(m)
    End Sub

Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
’TextChangedイベントトラップを使って処理を実行
MessageBox.Show(Me.TextBox1.Text)

Me.TextBox1.Text = " "
End Sub

VBでしか動かせないものがある場合に使用出来ます。
VBフォームを予めOpenしておかなければならない点が我慢できるのであれば
選択肢として使えるのではないかと思います。