SELECT * FROM kb0_ui WHERE is_use_zengliang_tongji=1 AND kb0_idstr='t_yi1xek3dhp' AND dianwei_name='dianneng_zong' AND (ADDTIME BETWEEN '2021/01/01 00:00:00' AND '2022/01/01 00:00:00') ORDER BY diff_value1 DESC ,id ASC LIMIT 0,22
比
SELECT * FROM kb0_ui WHERE is_use_zengliang_tongji=1 AND kb0_idstr='t_yi1xek3dhp' AND dianwei_name='dianneng_zong' AND (ADDTIME BETWEEN '2021/01/01 00:00:00' AND '2022/01/01 00:00:00') ORDER BY diff_value1 DESC LIMIT 0,22
要快!!,
或者ORDER BY round(diff_value1,5) DESC 也快
--------------------------
company_id LIKE '...' 反而比company_id ='...'要快,可能改为 company_id LIKE '...' 后主键索引变为了ADDTIME ,
explain 分析 key_len从171变小为 17了 :
SELECT SUM(diff_value1) AS zong_diff1,date_hour_index FROM kb0_ui WHERE is_use_zengliang_tongji=1 AND dianwei_name='dianneng_zong' AND (company_id LIKE 't_uolcoya67e') AND (ADDTIME >= '2021-11-04 00:00:00' ) AND ADDTIME <= '2021-11-04 23:59:59' GROUP BY date_hour_index
比
SELECT SUM(diff_value1) AS zong_diff1,date_hour_index FROM kb0_ui WHERE is_use_zengliang_tongji=1 AND dianwei_name='dianneng_zong' AND (company_id = 't_uolcoya67e') AND (ADDTIME >= '2021-11-04 00:00:00' ) AND ADDTIME <= '2021-11-04 23:59:59' GROUP BY date_hour_index
===================================================================
public int SendPortSP_try_more(string v20_sub_cmd_is_dl_or_68xieyi, int gongwei_index, int is_rec_senddata_str0_or_rec_senddata_len1, int comm_index, string cmd1, byte[] ombuffer, int wait_sec = -1, int isnowait = -1, int isPLC = -1, int is_stopmsg_err1 = 0, int is_nowait_for_liji_closeV = 0, int recv_mubiao_length = 0, byte headbyte = 0, string sub_cmd = "", float wait_sec_after_write=-1)
{
.........................
if (wait_sec_after_write >= 0.01f)
{
if (sleep_with_rt_ok(wait_sec_after_write * 1000, gongwei_index,comm_index) == 1)
{
sended = 1;
break;
}
}
if (isnowait == 0)//v1002:
{
//防止重发包的返回包干扰下面的续包:
if (sleep_with_rt_ok(1 * 1000, gongwei_index, comm_index) == 1)
{
sended = 1;
break;
}
}
===================================================================
NO1。
所有textBox和checkbox, radioButton等全部要用拼音尾缀来命名,不能用数字尾缀来命令,否则容易
弄错textBox,而导致隐藏的bug几个月
-----------------
有很多按钮的界面,可以把按钮的事件做成一个,然后switch (button.Name)一下,比分散写到各个事件函数里要方便:
private void f1_h2004_Click(object sender, EventArgs e)
{
Button button = (Button) sender;
switch (button.Name)
{
case "f1_h2004":
this.x_Omron.写[0].value_D500[0x1b] = 1;
this.x_Omron.写[0].cmd_D500[0x1b] = true;
break;
case "f1_h2005":
===================================================================
vs2010里如果复制某个界面的控件到新工程,那么所有输入框事件和combox控件的改变事件都要手工拷贝来,不然很可能改值后保存不住,
而引发写入参数不是改动的值,从而参数始终不变而改不了,误以为写成功了,比如跳闸阀值,这样有安全风险!!!!
===================================================================
选择性序列化:
[Serializable]
public class MyObject
{
public int n1;
[NonSerialized] public int n2;
public String str;
}
===================================================================
验证断路器等写入的参数是否正确写入时,缓存原始写入值的变量最好带绝对地址,否则按变量索引增量时容易出日后的兼容性问题:
//v3.3:
public int get_val_by_writed_d_addr(int addr11, List<v1000_val_cls> writed_d)
{
foreach (v1000_val_cls in1 in writed_d)
{
if (in1.addr == addr11)
{
return in1.val1;
}
public int SendPortSP_try_more(string v20_sub_cmd_is_dl_or_68xieyi, int gongwei_index, int is_rec_senddata_str0_or_rec_senddata_len1, int comm_index, string cmd1, byte[] ombuffer, int wait_sec = -1, int isnowait = -1, int isPLC = -1, int is_stopmsg_err1 = 0, int is_nowait_for_liji_closeV = 0, int recv_mubiao_length = 0, byte headbyte = 0, string sub_cmd = "", int wait_sec_after_write=-1)
{
lock (lock_obj1[comm_lock_index])//bug????
{
lock (lock_obj2_recv_timeout)
{
rttobj.v16_buffer.Clear();//v80
rttobj.v40_cur_datastep = 0;//v400 !!!!!must
System.Threading.Thread.Sleep(3);//v500,防止下一个包影响上一个包的发包代码后的if(recv_ok1b!=1.........
rttobj.recv_ok1b = 0;//v80
}
===================================================================
Program.cs里加入容错机制,出错时不奔溃,而显示错误信息:
static class Program
{
================================================================================================
用 序列化类来保存参数时,各参数类务必不要含类的引用,而要用类的my_ID形式来保存引用哪个ID的类,否则序列化后类的引用丢失!!
================================================================================================
删除元素时务必在for (i。。。。扫描外再套层 while (ishave == 1),不然某些条件下会漏删:
int ishave=1;//must 1
while (ishave == 1)
{
ishave = 0;
for (int ii = 0; ii < sim_UI_cls.all_yuanjian_links.Count; ii++)
{
if (sim_UI_cls.all_yuanjian_links[ii].yuanjian_id_form == pw_draw_shows.last_moveover_ele.yuanjian_id)
{
sim_UI_cls.all_yuanjian_links.RemoveAt(ii);
ii = 0; ishave = 1;
continue;
}
if (sim_UI_cls.all_yuanjian_links[ii].yuanjian_id_to == pw_draw_shows.last_moveover_ele.yuanjian_id)
{
sim_UI_cls.all_yuanjian_links.RemoveAt(ii);
ii = 0; ishave = 1;
continue;